/src/libluksde/libfcrypto/libfcrypto_blowfish_context.c
Line | Count | Source (jump to first uncovered line) |
1 | | /* |
2 | | * Blowfish (de/en)crypt functions |
3 | | * |
4 | | * Copyright (C) 2017-2024, Joachim Metz <joachim.metz@gmail.com> |
5 | | * |
6 | | * Refer to AUTHORS for acknowledgements. |
7 | | * |
8 | | * This program is free software: you can redistribute it and/or modify |
9 | | * it under the terms of the GNU Lesser General Public License as published by |
10 | | * the Free Software Foundation, either version 3 of the License, or |
11 | | * (at your option) any later version. |
12 | | * |
13 | | * This program 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 General Public License for more details. |
17 | | * |
18 | | * You should have received a copy of the GNU Lesser General Public License |
19 | | * along with this program. If not, see <https://www.gnu.org/licenses/>. |
20 | | */ |
21 | | |
22 | | #include <common.h> |
23 | | #include <byte_stream.h> |
24 | | #include <memory.h> |
25 | | #include <types.h> |
26 | | |
27 | | #include "libfcrypto_blowfish_context.h" |
28 | | #include "libfcrypto_definitions.h" |
29 | | #include "libfcrypto_libcerror.h" |
30 | | |
31 | | /* The initial permutation values (P-array) |
32 | | */ |
33 | | static uint32_t libfcrypto_blowfish_initial_permutation_values[ 18 ] = { |
34 | | 0x243f6a88L, 0x85a308d3L, 0x13198a2eL, 0x03707344L, |
35 | | 0xa4093822L, 0x299f31d0L, 0x082efa98L, 0xec4e6c89L, |
36 | | 0x452821e6L, 0x38d01377L, 0xbe5466cfL, 0x34e90c6cL, |
37 | | 0xc0ac29b7L, 0xc97c50ddL, 0x3f84d5b5L, 0xb5470917L, |
38 | | 0x9216d5d9L, 0x8979fb1bL }; |
39 | | |
40 | | /* The initial substitution-boxes (S-boxes) |
41 | | */ |
42 | | static uint32_t libfcrypto_blowfish_initial_sboxes[ 4 ][ 256 ] = { |
43 | | { 0xd1310ba6L, 0x98dfb5acL, 0x2ffd72dbL, 0xd01adfb7L, |
44 | | 0xb8e1afedL, 0x6a267e96L, 0xba7c9045L, 0xf12c7f99L, |
45 | | 0x24a19947L, 0xb3916cf7L, 0x0801f2e2L, 0x858efc16L, |
46 | | 0x636920d8L, 0x71574e69L, 0xa458fea3L, 0xf4933d7eL, |
47 | | 0x0d95748fL, 0x728eb658L, 0x718bcd58L, 0x82154aeeL, |
48 | | 0x7b54a41dL, 0xc25a59b5L, 0x9c30d539L, 0x2af26013L, |
49 | | 0xc5d1b023L, 0x286085f0L, 0xca417918L, 0xb8db38efL, |
50 | | 0x8e79dcb0L, 0x603a180eL, 0x6c9e0e8bL, 0xb01e8a3eL, |
51 | | 0xd71577c1L, 0xbd314b27L, 0x78af2fdaL, 0x55605c60L, |
52 | | 0xe65525f3L, 0xaa55ab94L, 0x57489862L, 0x63e81440L, |
53 | | 0x55ca396aL, 0x2aab10b6L, 0xb4cc5c34L, 0x1141e8ceL, |
54 | | 0xa15486afL, 0x7c72e993L, 0xb3ee1411L, 0x636fbc2aL, |
55 | | 0x2ba9c55dL, 0x741831f6L, 0xce5c3e16L, 0x9b87931eL, |
56 | | 0xafd6ba33L, 0x6c24cf5cL, 0x7a325381L, 0x28958677L, |
57 | | 0x3b8f4898L, 0x6b4bb9afL, 0xc4bfe81bL, 0x66282193L, |
58 | | 0x61d809ccL, 0xfb21a991L, 0x487cac60L, 0x5dec8032L, |
59 | | 0xef845d5dL, 0xe98575b1L, 0xdc262302L, 0xeb651b88L, |
60 | | 0x23893e81L, 0xd396acc5L, 0x0f6d6ff3L, 0x83f44239L, |
61 | | 0x2e0b4482L, 0xa4842004L, 0x69c8f04aL, 0x9e1f9b5eL, |
62 | | 0x21c66842L, 0xf6e96c9aL, 0x670c9c61L, 0xabd388f0L, |
63 | | 0x6a51a0d2L, 0xd8542f68L, 0x960fa728L, 0xab5133a3L, |
64 | | 0x6eef0b6cL, 0x137a3be4L, 0xba3bf050L, 0x7efb2a98L, |
65 | | 0xa1f1651dL, 0x39af0176L, 0x66ca593eL, 0x82430e88L, |
66 | | 0x8cee8619L, 0x456f9fb4L, 0x7d84a5c3L, 0x3b8b5ebeL, |
67 | | 0xe06f75d8L, 0x85c12073L, 0x401a449fL, 0x56c16aa6L, |
68 | | 0x4ed3aa62L, 0x363f7706L, 0x1bfedf72L, 0x429b023dL, |
69 | | 0x37d0d724L, 0xd00a1248L, 0xdb0fead3L, 0x49f1c09bL, |
70 | | 0x075372c9L, 0x80991b7bL, 0x25d479d8L, 0xf6e8def7L, |
71 | | 0xe3fe501aL, 0xb6794c3bL, 0x976ce0bdL, 0x04c006baL, |
72 | | 0xc1a94fb6L, 0x409f60c4L, 0x5e5c9ec2L, 0x196a2463L, |
73 | | 0x68fb6fafL, 0x3e6c53b5L, 0x1339b2ebL, 0x3b52ec6fL, |
74 | | 0x6dfc511fL, 0x9b30952cL, 0xcc814544L, 0xaf5ebd09L, |
75 | | 0xbee3d004L, 0xde334afdL, 0x660f2807L, 0x192e4bb3L, |
76 | | 0xc0cba857L, 0x45c8740fL, 0xd20b5f39L, 0xb9d3fbdbL, |
77 | | 0x5579c0bdL, 0x1a60320aL, 0xd6a100c6L, 0x402c7279L, |
78 | | 0x679f25feL, 0xfb1fa3ccL, 0x8ea5e9f8L, 0xdb3222f8L, |
79 | | 0x3c7516dfL, 0xfd616b15L, 0x2f501ec8L, 0xad0552abL, |
80 | | 0x323db5faL, 0xfd238760L, 0x53317b48L, 0x3e00df82L, |
81 | | 0x9e5c57bbL, 0xca6f8ca0L, 0x1a87562eL, 0xdf1769dbL, |
82 | | 0xd542a8f6L, 0x287effc3L, 0xac6732c6L, 0x8c4f5573L, |
83 | | 0x695b27b0L, 0xbbca58c8L, 0xe1ffa35dL, 0xb8f011a0L, |
84 | | 0x10fa3d98L, 0xfd2183b8L, 0x4afcb56cL, 0x2dd1d35bL, |
85 | | 0x9a53e479L, 0xb6f84565L, 0xd28e49bcL, 0x4bfb9790L, |
86 | | 0xe1ddf2daL, 0xa4cb7e33L, 0x62fb1341L, 0xcee4c6e8L, |
87 | | 0xef20cadaL, 0x36774c01L, 0xd07e9efeL, 0x2bf11fb4L, |
88 | | 0x95dbda4dL, 0xae909198L, 0xeaad8e71L, 0x6b93d5a0L, |
89 | | 0xd08ed1d0L, 0xafc725e0L, 0x8e3c5b2fL, 0x8e7594b7L, |
90 | | 0x8ff6e2fbL, 0xf2122b64L, 0x8888b812L, 0x900df01cL, |
91 | | 0x4fad5ea0L, 0x688fc31cL, 0xd1cff191L, 0xb3a8c1adL, |
92 | | 0x2f2f2218L, 0xbe0e1777L, 0xea752dfeL, 0x8b021fa1L, |
93 | | 0xe5a0cc0fL, 0xb56f74e8L, 0x18acf3d6L, 0xce89e299L, |
94 | | 0xb4a84fe0L, 0xfd13e0b7L, 0x7cc43b81L, 0xd2ada8d9L, |
95 | | 0x165fa266L, 0x80957705L, 0x93cc7314L, 0x211a1477L, |
96 | | 0xe6ad2065L, 0x77b5fa86L, 0xc75442f5L, 0xfb9d35cfL, |
97 | | 0xebcdaf0cL, 0x7b3e89a0L, 0xd6411bd3L, 0xae1e7e49L, |
98 | | 0x00250e2dL, 0x2071b35eL, 0x226800bbL, 0x57b8e0afL, |
99 | | 0x2464369bL, 0xf009b91eL, 0x5563911dL, 0x59dfa6aaL, |
100 | | 0x78c14389L, 0xd95a537fL, 0x207d5ba2L, 0x02e5b9c5L, |
101 | | 0x83260376L, 0x6295cfa9L, 0x11c81968L, 0x4e734a41L, |
102 | | 0xb3472dcaL, 0x7b14a94aL, 0x1b510052L, 0x9a532915L, |
103 | | 0xd60f573fL, 0xbc9bc6e4L, 0x2b60a476L, 0x81e67400L, |
104 | | 0x08ba6fb5L, 0x571be91fL, 0xf296ec6bL, 0x2a0dd915L, |
105 | | 0xb6636521L, 0xe7b9f9b6L, 0xff34052eL, 0xc5855664L, |
106 | | 0x53b02d5dL, 0xa99f8fa1L, 0x08ba4799L, 0x6e85076aL }, |
107 | | { 0x4b7a70e9L, 0xb5b32944L, 0xdb75092eL, 0xc4192623L, |
108 | | 0xad6ea6b0L, 0x49a7df7dL, 0x9cee60b8L, 0x8fedb266L, |
109 | | 0xecaa8c71L, 0x699a17ffL, 0x5664526cL, 0xc2b19ee1L, |
110 | | 0x193602a5L, 0x75094c29L, 0xa0591340L, 0xe4183a3eL, |
111 | | 0x3f54989aL, 0x5b429d65L, 0x6b8fe4d6L, 0x99f73fd6L, |
112 | | 0xa1d29c07L, 0xefe830f5L, 0x4d2d38e6L, 0xf0255dc1L, |
113 | | 0x4cdd2086L, 0x8470eb26L, 0x6382e9c6L, 0x021ecc5eL, |
114 | | 0x09686b3fL, 0x3ebaefc9L, 0x3c971814L, 0x6b6a70a1L, |
115 | | 0x687f3584L, 0x52a0e286L, 0xb79c5305L, 0xaa500737L, |
116 | | 0x3e07841cL, 0x7fdeae5cL, 0x8e7d44ecL, 0x5716f2b8L, |
117 | | 0xb03ada37L, 0xf0500c0dL, 0xf01c1f04L, 0x0200b3ffL, |
118 | | 0xae0cf51aL, 0x3cb574b2L, 0x25837a58L, 0xdc0921bdL, |
119 | | 0xd19113f9L, 0x7ca92ff6L, 0x94324773L, 0x22f54701L, |
120 | | 0x3ae5e581L, 0x37c2dadcL, 0xc8b57634L, 0x9af3dda7L, |
121 | | 0xa9446146L, 0x0fd0030eL, 0xecc8c73eL, 0xa4751e41L, |
122 | | 0xe238cd99L, 0x3bea0e2fL, 0x3280bba1L, 0x183eb331L, |
123 | | 0x4e548b38L, 0x4f6db908L, 0x6f420d03L, 0xf60a04bfL, |
124 | | 0x2cb81290L, 0x24977c79L, 0x5679b072L, 0xbcaf89afL, |
125 | | 0xde9a771fL, 0xd9930810L, 0xb38bae12L, 0xdccf3f2eL, |
126 | | 0x5512721fL, 0x2e6b7124L, 0x501adde6L, 0x9f84cd87L, |
127 | | 0x7a584718L, 0x7408da17L, 0xbc9f9abcL, 0xe94b7d8cL, |
128 | | 0xec7aec3aL, 0xdb851dfaL, 0x63094366L, 0xc464c3d2L, |
129 | | 0xef1c1847L, 0x3215d908L, 0xdd433b37L, 0x24c2ba16L, |
130 | | 0x12a14d43L, 0x2a65c451L, 0x50940002L, 0x133ae4ddL, |
131 | | 0x71dff89eL, 0x10314e55L, 0x81ac77d6L, 0x5f11199bL, |
132 | | 0x043556f1L, 0xd7a3c76bL, 0x3c11183bL, 0x5924a509L, |
133 | | 0xf28fe6edL, 0x97f1fbfaL, 0x9ebabf2cL, 0x1e153c6eL, |
134 | | 0x86e34570L, 0xeae96fb1L, 0x860e5e0aL, 0x5a3e2ab3L, |
135 | | 0x771fe71cL, 0x4e3d06faL, 0x2965dcb9L, 0x99e71d0fL, |
136 | | 0x803e89d6L, 0x5266c825L, 0x2e4cc978L, 0x9c10b36aL, |
137 | | 0xc6150ebaL, 0x94e2ea78L, 0xa5fc3c53L, 0x1e0a2df4L, |
138 | | 0xf2f74ea7L, 0x361d2b3dL, 0x1939260fL, 0x19c27960L, |
139 | | 0x5223a708L, 0xf71312b6L, 0xebadfe6eL, 0xeac31f66L, |
140 | | 0xe3bc4595L, 0xa67bc883L, 0xb17f37d1L, 0x018cff28L, |
141 | | 0xc332ddefL, 0xbe6c5aa5L, 0x65582185L, 0x68ab9802L, |
142 | | 0xeecea50fL, 0xdb2f953bL, 0x2aef7dadL, 0x5b6e2f84L, |
143 | | 0x1521b628L, 0x29076170L, 0xecdd4775L, 0x619f1510L, |
144 | | 0x13cca830L, 0xeb61bd96L, 0x0334fe1eL, 0xaa0363cfL, |
145 | | 0xb5735c90L, 0x4c70a239L, 0xd59e9e0bL, 0xcbaade14L, |
146 | | 0xeecc86bcL, 0x60622ca7L, 0x9cab5cabL, 0xb2f3846eL, |
147 | | 0x648b1eafL, 0x19bdf0caL, 0xa02369b9L, 0x655abb50L, |
148 | | 0x40685a32L, 0x3c2ab4b3L, 0x319ee9d5L, 0xc021b8f7L, |
149 | | 0x9b540b19L, 0x875fa099L, 0x95f7997eL, 0x623d7da8L, |
150 | | 0xf837889aL, 0x97e32d77L, 0x11ed935fL, 0x16681281L, |
151 | | 0x0e358829L, 0xc7e61fd6L, 0x96dedfa1L, 0x7858ba99L, |
152 | | 0x57f584a5L, 0x1b227263L, 0x9b83c3ffL, 0x1ac24696L, |
153 | | 0xcdb30aebL, 0x532e3054L, 0x8fd948e4L, 0x6dbc3128L, |
154 | | 0x58ebf2efL, 0x34c6ffeaL, 0xfe28ed61L, 0xee7c3c73L, |
155 | | 0x5d4a14d9L, 0xe864b7e3L, 0x42105d14L, 0x203e13e0L, |
156 | | 0x45eee2b6L, 0xa3aaabeaL, 0xdb6c4f15L, 0xfacb4fd0L, |
157 | | 0xc742f442L, 0xef6abbb5L, 0x654f3b1dL, 0x41cd2105L, |
158 | | 0xd81e799eL, 0x86854dc7L, 0xe44b476aL, 0x3d816250L, |
159 | | 0xcf62a1f2L, 0x5b8d2646L, 0xfc8883a0L, 0xc1c7b6a3L, |
160 | | 0x7f1524c3L, 0x69cb7492L, 0x47848a0bL, 0x5692b285L, |
161 | | 0x095bbf00L, 0xad19489dL, 0x1462b174L, 0x23820e00L, |
162 | | 0x58428d2aL, 0x0c55f5eaL, 0x1dadf43eL, 0x233f7061L, |
163 | | 0x3372f092L, 0x8d937e41L, 0xd65fecf1L, 0x6c223bdbL, |
164 | | 0x7cde3759L, 0xcbee7460L, 0x4085f2a7L, 0xce77326eL, |
165 | | 0xa6078084L, 0x19f8509eL, 0xe8efd855L, 0x61d99735L, |
166 | | 0xa969a7aaL, 0xc50c06c2L, 0x5a04abfcL, 0x800bcadcL, |
167 | | 0x9e447a2eL, 0xc3453484L, 0xfdd56705L, 0x0e1e9ec9L, |
168 | | 0xdb73dbd3L, 0x105588cdL, 0x675fda79L, 0xe3674340L, |
169 | | 0xc5c43465L, 0x713e38d8L, 0x3d28f89eL, 0xf16dff20L, |
170 | | 0x153e21e7L, 0x8fb03d4aL, 0xe6e39f2bL, 0xdb83adf7L }, |
171 | | { 0xe93d5a68L, 0x948140f7L, 0xf64c261cL, 0x94692934L, |
172 | | 0x411520f7L, 0x7602d4f7L, 0xbcf46b2eL, 0xd4a20068L, |
173 | | 0xd4082471L, 0x3320f46aL, 0x43b7d4b7L, 0x500061afL, |
174 | | 0x1e39f62eL, 0x97244546L, 0x14214f74L, 0xbf8b8840L, |
175 | | 0x4d95fc1dL, 0x96b591afL, 0x70f4ddd3L, 0x66a02f45L, |
176 | | 0xbfbc09ecL, 0x03bd9785L, 0x7fac6dd0L, 0x31cb8504L, |
177 | | 0x96eb27b3L, 0x55fd3941L, 0xda2547e6L, 0xabca0a9aL, |
178 | | 0x28507825L, 0x530429f4L, 0x0a2c86daL, 0xe9b66dfbL, |
179 | | 0x68dc1462L, 0xd7486900L, 0x680ec0a4L, 0x27a18deeL, |
180 | | 0x4f3ffea2L, 0xe887ad8cL, 0xb58ce006L, 0x7af4d6b6L, |
181 | | 0xaace1e7cL, 0xd3375fecL, 0xce78a399L, 0x406b2a42L, |
182 | | 0x20fe9e35L, 0xd9f385b9L, 0xee39d7abL, 0x3b124e8bL, |
183 | | 0x1dc9faf7L, 0x4b6d1856L, 0x26a36631L, 0xeae397b2L, |
184 | | 0x3a6efa74L, 0xdd5b4332L, 0x6841e7f7L, 0xca7820fbL, |
185 | | 0xfb0af54eL, 0xd8feb397L, 0x454056acL, 0xba489527L, |
186 | | 0x55533a3aL, 0x20838d87L, 0xfe6ba9b7L, 0xd096954bL, |
187 | | 0x55a867bcL, 0xa1159a58L, 0xcca92963L, 0x99e1db33L, |
188 | | 0xa62a4a56L, 0x3f3125f9L, 0x5ef47e1cL, 0x9029317cL, |
189 | | 0xfdf8e802L, 0x04272f70L, 0x80bb155cL, 0x05282ce3L, |
190 | | 0x95c11548L, 0xe4c66d22L, 0x48c1133fL, 0xc70f86dcL, |
191 | | 0x07f9c9eeL, 0x41041f0fL, 0x404779a4L, 0x5d886e17L, |
192 | | 0x325f51ebL, 0xd59bc0d1L, 0xf2bcc18fL, 0x41113564L, |
193 | | 0x257b7834L, 0x602a9c60L, 0xdff8e8a3L, 0x1f636c1bL, |
194 | | 0x0e12b4c2L, 0x02e1329eL, 0xaf664fd1L, 0xcad18115L, |
195 | | 0x6b2395e0L, 0x333e92e1L, 0x3b240b62L, 0xeebeb922L, |
196 | | 0x85b2a20eL, 0xe6ba0d99L, 0xde720c8cL, 0x2da2f728L, |
197 | | 0xd0127845L, 0x95b794fdL, 0x647d0862L, 0xe7ccf5f0L, |
198 | | 0x5449a36fL, 0x877d48faL, 0xc39dfd27L, 0xf33e8d1eL, |
199 | | 0x0a476341L, 0x992eff74L, 0x3a6f6eabL, 0xf4f8fd37L, |
200 | | 0xa812dc60L, 0xa1ebddf8L, 0x991be14cL, 0xdb6e6b0dL, |
201 | | 0xc67b5510L, 0x6d672c37L, 0x2765d43bL, 0xdcd0e804L, |
202 | | 0xf1290dc7L, 0xcc00ffa3L, 0xb5390f92L, 0x690fed0bL, |
203 | | 0x667b9ffbL, 0xcedb7d9cL, 0xa091cf0bL, 0xd9155ea3L, |
204 | | 0xbb132f88L, 0x515bad24L, 0x7b9479bfL, 0x763bd6ebL, |
205 | | 0x37392eb3L, 0xcc115979L, 0x8026e297L, 0xf42e312dL, |
206 | | 0x6842ada7L, 0xc66a2b3bL, 0x12754cccL, 0x782ef11cL, |
207 | | 0x6a124237L, 0xb79251e7L, 0x06a1bbe6L, 0x4bfb6350L, |
208 | | 0x1a6b1018L, 0x11caedfaL, 0x3d25bdd8L, 0xe2e1c3c9L, |
209 | | 0x44421659L, 0x0a121386L, 0xd90cec6eL, 0xd5abea2aL, |
210 | | 0x64af674eL, 0xda86a85fL, 0xbebfe988L, 0x64e4c3feL, |
211 | | 0x9dbc8057L, 0xf0f7c086L, 0x60787bf8L, 0x6003604dL, |
212 | | 0xd1fd8346L, 0xf6381fb0L, 0x7745ae04L, 0xd736fcccL, |
213 | | 0x83426b33L, 0xf01eab71L, 0xb0804187L, 0x3c005e5fL, |
214 | | 0x77a057beL, 0xbde8ae24L, 0x55464299L, 0xbf582e61L, |
215 | | 0x4e58f48fL, 0xf2ddfda2L, 0xf474ef38L, 0x8789bdc2L, |
216 | | 0x5366f9c3L, 0xc8b38e74L, 0xb475f255L, 0x46fcd9b9L, |
217 | | 0x7aeb2661L, 0x8b1ddf84L, 0x846a0e79L, 0x915f95e2L, |
218 | | 0x466e598eL, 0x20b45770L, 0x8cd55591L, 0xc902de4cL, |
219 | | 0xb90bace1L, 0xbb8205d0L, 0x11a86248L, 0x7574a99eL, |
220 | | 0xb77f19b6L, 0xe0a9dc09L, 0x662d09a1L, 0xc4324633L, |
221 | | 0xe85a1f02L, 0x09f0be8cL, 0x4a99a025L, 0x1d6efe10L, |
222 | | 0x1ab93d1dL, 0x0ba5a4dfL, 0xa186f20fL, 0x2868f169L, |
223 | | 0xdcb7da83L, 0x573906feL, 0xa1e2ce9bL, 0x4fcd7f52L, |
224 | | 0x50115e01L, 0xa70683faL, 0xa002b5c4L, 0x0de6d027L, |
225 | | 0x9af88c27L, 0x773f8641L, 0xc3604c06L, 0x61a806b5L, |
226 | | 0xf0177a28L, 0xc0f586e0L, 0x006058aaL, 0x30dc7d62L, |
227 | | 0x11e69ed7L, 0x2338ea63L, 0x53c2dd94L, 0xc2c21634L, |
228 | | 0xbbcbee56L, 0x90bcb6deL, 0xebfc7da1L, 0xce591d76L, |
229 | | 0x6f05e409L, 0x4b7c0188L, 0x39720a3dL, 0x7c927c24L, |
230 | | 0x86e3725fL, 0x724d9db9L, 0x1ac15bb4L, 0xd39eb8fcL, |
231 | | 0xed545578L, 0x08fca5b5L, 0xd83d7cd3L, 0x4dad0fc4L, |
232 | | 0x1e50ef5eL, 0xb161e6f8L, 0xa28514d9L, 0x6c51133cL, |
233 | | 0x6fd5c7e7L, 0x56e14ec4L, 0x362abfceL, 0xddc6c837L, |
234 | | 0xd79a3234L, 0x92638212L, 0x670efa8eL, 0x406000e0L }, |
235 | | { 0x3a39ce37L, 0xd3faf5cfL, 0xabc27737L, 0x5ac52d1bL, |
236 | | 0x5cb0679eL, 0x4fa33742L, 0xd3822740L, 0x99bc9bbeL, |
237 | | 0xd5118e9dL, 0xbf0f7315L, 0xd62d1c7eL, 0xc700c47bL, |
238 | | 0xb78c1b6bL, 0x21a19045L, 0xb26eb1beL, 0x6a366eb4L, |
239 | | 0x5748ab2fL, 0xbc946e79L, 0xc6a376d2L, 0x6549c2c8L, |
240 | | 0x530ff8eeL, 0x468dde7dL, 0xd5730a1dL, 0x4cd04dc6L, |
241 | | 0x2939bbdbL, 0xa9ba4650L, 0xac9526e8L, 0xbe5ee304L, |
242 | | 0xa1fad5f0L, 0x6a2d519aL, 0x63ef8ce2L, 0x9a86ee22L, |
243 | | 0xc089c2b8L, 0x43242ef6L, 0xa51e03aaL, 0x9cf2d0a4L, |
244 | | 0x83c061baL, 0x9be96a4dL, 0x8fe51550L, 0xba645bd6L, |
245 | | 0x2826a2f9L, 0xa73a3ae1L, 0x4ba99586L, 0xef5562e9L, |
246 | | 0xc72fefd3L, 0xf752f7daL, 0x3f046f69L, 0x77fa0a59L, |
247 | | 0x80e4a915L, 0x87b08601L, 0x9b09e6adL, 0x3b3ee593L, |
248 | | 0xe990fd5aL, 0x9e34d797L, 0x2cf0b7d9L, 0x022b8b51L, |
249 | | 0x96d5ac3aL, 0x017da67dL, 0xd1cf3ed6L, 0x7c7d2d28L, |
250 | | 0x1f9f25cfL, 0xadf2b89bL, 0x5ad6b472L, 0x5a88f54cL, |
251 | | 0xe029ac71L, 0xe019a5e6L, 0x47b0acfdL, 0xed93fa9bL, |
252 | | 0xe8d3c48dL, 0x283b57ccL, 0xf8d56629L, 0x79132e28L, |
253 | | 0x785f0191L, 0xed756055L, 0xf7960e44L, 0xe3d35e8cL, |
254 | | 0x15056dd4L, 0x88f46dbaL, 0x03a16125L, 0x0564f0bdL, |
255 | | 0xc3eb9e15L, 0x3c9057a2L, 0x97271aecL, 0xa93a072aL, |
256 | | 0x1b3f6d9bL, 0x1e6321f5L, 0xf59c66fbL, 0x26dcf319L, |
257 | | 0x7533d928L, 0xb155fdf5L, 0x03563482L, 0x8aba3cbbL, |
258 | | 0x28517711L, 0xc20ad9f8L, 0xabcc5167L, 0xccad925fL, |
259 | | 0x4de81751L, 0x3830dc8eL, 0x379d5862L, 0x9320f991L, |
260 | | 0xea7a90c2L, 0xfb3e7bceL, 0x5121ce64L, 0x774fbe32L, |
261 | | 0xa8b6e37eL, 0xc3293d46L, 0x48de5369L, 0x6413e680L, |
262 | | 0xa2ae0810L, 0xdd6db224L, 0x69852dfdL, 0x09072166L, |
263 | | 0xb39a460aL, 0x6445c0ddL, 0x586cdecfL, 0x1c20c8aeL, |
264 | | 0x5bbef7ddL, 0x1b588d40L, 0xccd2017fL, 0x6bb4e3bbL, |
265 | | 0xdda26a7eL, 0x3a59ff45L, 0x3e350a44L, 0xbcb4cdd5L, |
266 | | 0x72eacea8L, 0xfa6484bbL, 0x8d6612aeL, 0xbf3c6f47L, |
267 | | 0xd29be463L, 0x542f5d9eL, 0xaec2771bL, 0xf64e6370L, |
268 | | 0x740e0d8dL, 0xe75b1357L, 0xf8721671L, 0xaf537d5dL, |
269 | | 0x4040cb08L, 0x4eb4e2ccL, 0x34d2466aL, 0x0115af84L, |
270 | | 0xe1b00428L, 0x95983a1dL, 0x06b89fb4L, 0xce6ea048L, |
271 | | 0x6f3f3b82L, 0x3520ab82L, 0x011a1d4bL, 0x277227f8L, |
272 | | 0x611560b1L, 0xe7933fdcL, 0xbb3a792bL, 0x344525bdL, |
273 | | 0xa08839e1L, 0x51ce794bL, 0x2f32c9b7L, 0xa01fbac9L, |
274 | | 0xe01cc87eL, 0xbcc7d1f6L, 0xcf0111c3L, 0xa1e8aac7L, |
275 | | 0x1a908749L, 0xd44fbd9aL, 0xd0dadecbL, 0xd50ada38L, |
276 | | 0x0339c32aL, 0xc6913667L, 0x8df9317cL, 0xe0b12b4fL, |
277 | | 0xf79e59b7L, 0x43f5bb3aL, 0xf2d519ffL, 0x27d9459cL, |
278 | | 0xbf97222cL, 0x15e6fc2aL, 0x0f91fc71L, 0x9b941525L, |
279 | | 0xfae59361L, 0xceb69cebL, 0xc2a86459L, 0x12baa8d1L, |
280 | | 0xb6c1075eL, 0xe3056a0cL, 0x10d25065L, 0xcb03a442L, |
281 | | 0xe0ec6e0eL, 0x1698db3bL, 0x4c98a0beL, 0x3278e964L, |
282 | | 0x9f1f9532L, 0xe0d392dfL, 0xd3a0342bL, 0x8971f21eL, |
283 | | 0x1b0a7441L, 0x4ba3348cL, 0xc5be7120L, 0xc37632d8L, |
284 | | 0xdf359f8dL, 0x9b992f2eL, 0xe60b6f47L, 0x0fe3f11dL, |
285 | | 0xe54cda54L, 0x1edad891L, 0xce6279cfL, 0xcd3e7e6fL, |
286 | | 0x1618b166L, 0xfd2c1d05L, 0x848fd2c5L, 0xf6fb2299L, |
287 | | 0xf523f357L, 0xa6327623L, 0x93a83531L, 0x56cccd02L, |
288 | | 0xacf08162L, 0x5a75ebb5L, 0x6e163697L, 0x88d273ccL, |
289 | | 0xde966292L, 0x81b949d0L, 0x4c50901bL, 0x71c65614L, |
290 | | 0xe6c6c7bdL, 0x327a140aL, 0x45e1d006L, 0xc3f27b9aL, |
291 | | 0xc9aa53fdL, 0x62a80f00L, 0xbb25bfe2L, 0x35bdd2f6L, |
292 | | 0x71126905L, 0xb2040222L, 0xb6cbcf7cL, 0xcd769c2bL, |
293 | | 0x53113ec0L, 0x1640e3d3L, 0x38abbd60L, 0x2547adf0L, |
294 | | 0xba38209cL, 0xf746ce76L, 0x77afa1c5L, 0x20756060L, |
295 | | 0x85cbfe4eL, 0x8ae88dd8L, 0x7aaaf9b0L, 0x4cf9aa7eL, |
296 | | 0x1948c25cL, 0x02fb8a8cL, 0x01c36ae4L, 0xd6ebe1f9L, |
297 | | 0x90d4f869L, 0xa65cdea0L, 0x3f09252dL, 0xc208e69fL, |
298 | | 0xb74e6132L, 0xce77e25bL, 0x578fdfe3L, 0x3ac372e6L } }; |
299 | | |
300 | | /* Creates a Blowfish context |
301 | | * Make sure the value context is referencing, is set to NULL |
302 | | * Returns 1 if successful or -1 on error |
303 | | */ |
304 | | int libfcrypto_blowfish_context_initialize( |
305 | | libfcrypto_blowfish_context_t **context, |
306 | | libcerror_error_t **error ) |
307 | 112 | { |
308 | 112 | libfcrypto_internal_blowfish_context_t *internal_context = NULL; |
309 | 112 | static char *function = "libfcrypto_blowfish_context_initialize"; |
310 | | |
311 | 112 | if( context == NULL ) |
312 | 0 | { |
313 | 0 | libcerror_error_set( |
314 | 0 | error, |
315 | 0 | LIBCERROR_ERROR_DOMAIN_ARGUMENTS, |
316 | 0 | LIBCERROR_ARGUMENT_ERROR_INVALID_VALUE, |
317 | 0 | "%s: invalid context.", |
318 | 0 | function ); |
319 | |
|
320 | 0 | return( -1 ); |
321 | 0 | } |
322 | 112 | if( *context != NULL ) |
323 | 0 | { |
324 | 0 | libcerror_error_set( |
325 | 0 | error, |
326 | 0 | LIBCERROR_ERROR_DOMAIN_RUNTIME, |
327 | 0 | LIBCERROR_RUNTIME_ERROR_VALUE_ALREADY_SET, |
328 | 0 | "%s: invalid context value already set.", |
329 | 0 | function ); |
330 | |
|
331 | 0 | return( -1 ); |
332 | 0 | } |
333 | 112 | internal_context = memory_allocate_structure( |
334 | 112 | libfcrypto_internal_blowfish_context_t ); |
335 | | |
336 | 112 | if( internal_context == NULL ) |
337 | 0 | { |
338 | 0 | libcerror_error_set( |
339 | 0 | error, |
340 | 0 | LIBCERROR_ERROR_DOMAIN_MEMORY, |
341 | 0 | LIBCERROR_MEMORY_ERROR_INSUFFICIENT, |
342 | 0 | "%s: unable to create context.", |
343 | 0 | function ); |
344 | |
|
345 | 0 | goto on_error; |
346 | 0 | } |
347 | 112 | if( memory_set( |
348 | 112 | internal_context, |
349 | 112 | 0, |
350 | 112 | sizeof( libfcrypto_internal_blowfish_context_t ) ) == NULL ) |
351 | 0 | { |
352 | 0 | libcerror_error_set( |
353 | 0 | error, |
354 | 0 | LIBCERROR_ERROR_DOMAIN_MEMORY, |
355 | 0 | LIBCERROR_MEMORY_ERROR_SET_FAILED, |
356 | 0 | "%s: unable to clear context.", |
357 | 0 | function ); |
358 | |
|
359 | 0 | goto on_error; |
360 | 0 | } |
361 | 112 | *context = (libfcrypto_blowfish_context_t *) internal_context; |
362 | | |
363 | 112 | return( 1 ); |
364 | | |
365 | 0 | on_error: |
366 | 0 | if( internal_context != NULL ) |
367 | 0 | { |
368 | 0 | memory_free( |
369 | 0 | internal_context ); |
370 | 0 | } |
371 | 0 | return( -1 ); |
372 | 112 | } |
373 | | |
374 | | /* Frees a Blowfish context |
375 | | * Returns 1 if successful or -1 on error |
376 | | */ |
377 | | int libfcrypto_blowfish_context_free( |
378 | | libfcrypto_blowfish_context_t **context, |
379 | | libcerror_error_t **error ) |
380 | 112 | { |
381 | 112 | libfcrypto_internal_blowfish_context_t *internal_context = NULL; |
382 | 112 | static char *function = "libfcrypto_blowfish_context_free"; |
383 | 112 | int result = 1; |
384 | | |
385 | 112 | if( context == NULL ) |
386 | 0 | { |
387 | 0 | libcerror_error_set( |
388 | 0 | error, |
389 | 0 | LIBCERROR_ERROR_DOMAIN_ARGUMENTS, |
390 | 0 | LIBCERROR_ARGUMENT_ERROR_INVALID_VALUE, |
391 | 0 | "%s: invalid context.", |
392 | 0 | function ); |
393 | |
|
394 | 0 | return( -1 ); |
395 | 0 | } |
396 | 112 | if( *context != NULL ) |
397 | 112 | { |
398 | 112 | internal_context = (libfcrypto_internal_blowfish_context_t *) *context; |
399 | 112 | *context = NULL; |
400 | | |
401 | 112 | if( memory_set( |
402 | 112 | internal_context, |
403 | 112 | 0, |
404 | 112 | sizeof( libfcrypto_internal_blowfish_context_t ) ) == NULL ) |
405 | 0 | { |
406 | 0 | libcerror_error_set( |
407 | 0 | error, |
408 | 0 | LIBCERROR_ERROR_DOMAIN_MEMORY, |
409 | 0 | LIBCERROR_MEMORY_ERROR_SET_FAILED, |
410 | 0 | "%s: unable to clear context.", |
411 | 0 | function ); |
412 | |
|
413 | 0 | result = -1; |
414 | 0 | } |
415 | 112 | memory_free( |
416 | 112 | internal_context ); |
417 | 112 | } |
418 | 112 | return( result ); |
419 | 112 | } |
420 | | |
421 | | /* Encrypts values using Blowfish |
422 | | * Returns 1 if successful or -1 on error |
423 | | */ |
424 | | int libfcrypto_internal_blowfish_context_encrypt_values( |
425 | | libfcrypto_internal_blowfish_context_t *internal_context, |
426 | | uint32_t *value_left, |
427 | | uint32_t *value_right, |
428 | | libcerror_error_t **error ) |
429 | 58.3k | { |
430 | 58.3k | static char *function = "libfcrypto_internal_blowfish_context_encrypt_values"; |
431 | 58.3k | uint32_t value_32bit = 0; |
432 | 58.3k | uint32_t safe_value_left = 0; |
433 | 58.3k | uint32_t safe_value_right = 0; |
434 | 58.3k | uint8_t byte_value1 = 0; |
435 | 58.3k | uint8_t byte_value2 = 0; |
436 | 58.3k | uint8_t byte_value3 = 0; |
437 | 58.3k | uint8_t byte_value4 = 0; |
438 | 58.3k | uint8_t encryption_round = 0; |
439 | | |
440 | 58.3k | if( internal_context == NULL ) |
441 | 0 | { |
442 | 0 | libcerror_error_set( |
443 | 0 | error, |
444 | 0 | LIBCERROR_ERROR_DOMAIN_ARGUMENTS, |
445 | 0 | LIBCERROR_ARGUMENT_ERROR_INVALID_VALUE, |
446 | 0 | "%s: invalid context.", |
447 | 0 | function ); |
448 | |
|
449 | 0 | return( -1 ); |
450 | 0 | } |
451 | 58.3k | if( value_left == NULL ) |
452 | 0 | { |
453 | 0 | libcerror_error_set( |
454 | 0 | error, |
455 | 0 | LIBCERROR_ERROR_DOMAIN_ARGUMENTS, |
456 | 0 | LIBCERROR_ARGUMENT_ERROR_INVALID_VALUE, |
457 | 0 | "%s: invalid value left.", |
458 | 0 | function ); |
459 | |
|
460 | 0 | return( -1 ); |
461 | 0 | } |
462 | 58.3k | if( value_right == NULL ) |
463 | 0 | { |
464 | 0 | libcerror_error_set( |
465 | 0 | error, |
466 | 0 | LIBCERROR_ERROR_DOMAIN_ARGUMENTS, |
467 | 0 | LIBCERROR_ARGUMENT_ERROR_INVALID_VALUE, |
468 | 0 | "%s: invalid value right.", |
469 | 0 | function ); |
470 | |
|
471 | 0 | return( -1 ); |
472 | 0 | } |
473 | 58.3k | safe_value_left = *value_left; |
474 | 58.3k | safe_value_right = *value_right; |
475 | | |
476 | 58.3k | for( encryption_round = 0; |
477 | 991k | encryption_round < 16; |
478 | 933k | encryption_round++ ) |
479 | 933k | { |
480 | 933k | safe_value_left ^= internal_context->permutation_values[ encryption_round ]; |
481 | | |
482 | 933k | byte_value4 = (uint8_t) ( safe_value_left & 0x000000ffUL ); |
483 | 933k | byte_value3 = (uint8_t) ( ( safe_value_left >> 8 ) & 0x000000ffUL ); |
484 | 933k | byte_value2 = (uint8_t) ( ( safe_value_left >> 16 ) & 0x000000ffUL ); |
485 | 933k | byte_value1 = (uint8_t) ( ( safe_value_left >> 24 ) & 0x000000ffUL ); |
486 | | |
487 | 933k | value_32bit = internal_context->sboxes[ 0 ][ byte_value1 ]; |
488 | 933k | value_32bit += internal_context->sboxes[ 1 ][ byte_value2 ]; |
489 | 933k | value_32bit ^= internal_context->sboxes[ 2 ][ byte_value3 ]; |
490 | 933k | value_32bit += internal_context->sboxes[ 3 ][ byte_value4 ]; |
491 | | |
492 | 933k | safe_value_right ^= value_32bit; |
493 | | |
494 | 933k | value_32bit = safe_value_left; |
495 | 933k | safe_value_left = safe_value_right; |
496 | 933k | safe_value_right = value_32bit; |
497 | 933k | } |
498 | 58.3k | value_32bit = safe_value_left; |
499 | 58.3k | safe_value_left = safe_value_right; |
500 | 58.3k | safe_value_right = value_32bit; |
501 | | |
502 | 58.3k | safe_value_right ^= internal_context->permutation_values[ 16 ]; |
503 | 58.3k | safe_value_left ^= internal_context->permutation_values[ 17 ]; |
504 | | |
505 | 58.3k | *value_left = safe_value_left; |
506 | 58.3k | *value_right = safe_value_right; |
507 | | |
508 | 58.3k | return( 1 ); |
509 | 58.3k | } |
510 | | |
511 | | /* Sets the key |
512 | | * Returns 1 if successful or -1 on error |
513 | | */ |
514 | | int libfcrypto_blowfish_context_set_key( |
515 | | libfcrypto_blowfish_context_t *context, |
516 | | const uint8_t *key, |
517 | | size_t key_bit_size, |
518 | | libcerror_error_t **error ) |
519 | 112 | { |
520 | 112 | libfcrypto_internal_blowfish_context_t *internal_context = NULL; |
521 | 112 | static char *function = "libfcrypto_blowfish_context_set_key"; |
522 | 112 | size_t key_byte_index = 0; |
523 | 112 | size_t key_byte_size = 0; |
524 | 112 | uint32_t permutation_value = 0; |
525 | 112 | uint32_t value_left = 0; |
526 | 112 | uint32_t value_right = 0; |
527 | 112 | uint16_t byte_index = 0; |
528 | 112 | uint8_t permutation_value_index = 0; |
529 | 112 | uint8_t sbox_index = 0; |
530 | | |
531 | 112 | if( context == NULL ) |
532 | 0 | { |
533 | 0 | libcerror_error_set( |
534 | 0 | error, |
535 | 0 | LIBCERROR_ERROR_DOMAIN_ARGUMENTS, |
536 | 0 | LIBCERROR_ARGUMENT_ERROR_INVALID_VALUE, |
537 | 0 | "%s: invalid context.", |
538 | 0 | function ); |
539 | |
|
540 | 0 | return( -1 ); |
541 | 0 | } |
542 | 112 | internal_context = (libfcrypto_internal_blowfish_context_t *) context; |
543 | | |
544 | 112 | if( key == NULL ) |
545 | 0 | { |
546 | 0 | libcerror_error_set( |
547 | 0 | error, |
548 | 0 | LIBCERROR_ERROR_DOMAIN_ARGUMENTS, |
549 | 0 | LIBCERROR_ARGUMENT_ERROR_INVALID_VALUE, |
550 | 0 | "%s: invalid key.", |
551 | 0 | function ); |
552 | |
|
553 | 0 | return( -1 ); |
554 | 0 | } |
555 | 112 | if( ( key_bit_size < 32 ) |
556 | 112 | || ( key_bit_size > 448 ) |
557 | 112 | || ( ( key_bit_size % 8 ) != 0 ) ) |
558 | 0 | { |
559 | 0 | libcerror_error_set( |
560 | 0 | error, |
561 | 0 | LIBCERROR_ERROR_DOMAIN_ARGUMENTS, |
562 | 0 | LIBCERROR_ARGUMENT_ERROR_UNSUPPORTED_VALUE, |
563 | 0 | "%s: unsupported key bit size.", |
564 | 0 | function ); |
565 | |
|
566 | 0 | return( -1 ); |
567 | 0 | } |
568 | 112 | key_byte_size = key_bit_size / 8; |
569 | | |
570 | | /* TODO replace iteration by memory_copy */ |
571 | 112 | for( sbox_index = 0; |
572 | 560 | sbox_index < 4; |
573 | 448 | sbox_index++ ) |
574 | 448 | { |
575 | 448 | for( byte_index = 0; |
576 | 115k | byte_index < 256; |
577 | 114k | byte_index++ ) |
578 | 114k | { |
579 | 114k | internal_context->sboxes[ sbox_index ][ byte_index ] = libfcrypto_blowfish_initial_sboxes[ sbox_index ][ byte_index ]; |
580 | 114k | } |
581 | 448 | } |
582 | 112 | key_byte_index = 0; |
583 | | |
584 | 112 | for( permutation_value_index = 0; |
585 | 2.12k | permutation_value_index < 18; |
586 | 2.01k | permutation_value_index++ ) |
587 | 2.01k | { |
588 | 2.01k | permutation_value = 0; |
589 | | |
590 | 2.01k | for( sbox_index = 0; |
591 | 10.0k | sbox_index < 4; |
592 | 8.06k | sbox_index++ ) |
593 | 8.06k | { |
594 | 8.06k | permutation_value <<= 8; |
595 | 8.06k | permutation_value |= key[ key_byte_index++ ]; |
596 | | |
597 | 8.06k | if( key_byte_index >= key_byte_size ) |
598 | 2.01k | { |
599 | 2.01k | key_byte_index = 0; |
600 | 2.01k | } |
601 | 8.06k | } |
602 | 2.01k | internal_context->permutation_values[ permutation_value_index ] = libfcrypto_blowfish_initial_permutation_values[ permutation_value_index ] ^ permutation_value; |
603 | 2.01k | } |
604 | 112 | permutation_value_index = 0; |
605 | | |
606 | 1.12k | while( permutation_value_index < 18 ) |
607 | 1.00k | { |
608 | 1.00k | if( libfcrypto_internal_blowfish_context_encrypt_values( |
609 | 1.00k | internal_context, |
610 | 1.00k | &value_left, |
611 | 1.00k | &value_right, |
612 | 1.00k | error ) != 1 ) |
613 | 0 | { |
614 | 0 | libcerror_error_set( |
615 | 0 | error, |
616 | 0 | LIBCERROR_ERROR_DOMAIN_ENCRYPTION, |
617 | 0 | LIBCERROR_ENCRYPTION_ERROR_GENERIC, |
618 | 0 | "%s: unable to encrypt permutation values.", |
619 | 0 | function ); |
620 | |
|
621 | 0 | goto on_error; |
622 | 0 | } |
623 | 1.00k | internal_context->permutation_values[ permutation_value_index++ ] = value_left; |
624 | 1.00k | internal_context->permutation_values[ permutation_value_index++ ] = value_right; |
625 | 1.00k | } |
626 | 112 | for( sbox_index = 0; |
627 | 560 | sbox_index < 4; |
628 | 448 | sbox_index++ ) |
629 | 448 | { |
630 | 448 | byte_index = 0; |
631 | | |
632 | 57.7k | while( byte_index < 256 ) |
633 | 57.3k | { |
634 | 57.3k | if( libfcrypto_internal_blowfish_context_encrypt_values( |
635 | 57.3k | internal_context, |
636 | 57.3k | &value_left, |
637 | 57.3k | &value_right, |
638 | 57.3k | error ) != 1 ) |
639 | 0 | { |
640 | 0 | libcerror_error_set( |
641 | 0 | error, |
642 | 0 | LIBCERROR_ERROR_DOMAIN_ENCRYPTION, |
643 | 0 | LIBCERROR_ENCRYPTION_ERROR_GENERIC, |
644 | 0 | "%s: unable to encrypt permutation values.", |
645 | 0 | function ); |
646 | |
|
647 | 0 | goto on_error; |
648 | 0 | } |
649 | 57.3k | internal_context->sboxes[ sbox_index ][ byte_index++ ] = value_left; |
650 | 57.3k | internal_context->sboxes[ sbox_index ][ byte_index++ ] = value_right; |
651 | 57.3k | } |
652 | 448 | } |
653 | 112 | return( 1 ); |
654 | | |
655 | 0 | on_error: |
656 | 0 | memory_set( |
657 | 0 | internal_context->permutation_values, |
658 | 0 | 0, |
659 | 0 | sizeof( uint32_t ) * 18 ); |
660 | |
|
661 | 0 | memory_set( |
662 | 0 | internal_context->sboxes, |
663 | 0 | 0, |
664 | 0 | sizeof( uint8_t ) * 4 * 256 ); |
665 | |
|
666 | 0 | return( -1 ); |
667 | 112 | } |
668 | | |
669 | | /* Encrypts a block of data using Blowfish |
670 | | * The size must be a multitude of the Blowfish block size (8 byte) |
671 | | * Returns 1 if successful or -1 on error |
672 | | */ |
673 | | int libfcrypto_internal_blowfish_context_encrypt_block( |
674 | | libfcrypto_internal_blowfish_context_t *internal_context, |
675 | | const uint8_t *input_data, |
676 | | size_t input_data_size, |
677 | | uint8_t *output_data, |
678 | | size_t output_data_size, |
679 | | libcerror_error_t **error ) |
680 | 72 | { |
681 | 72 | static char *function = "libfcrypto_internal_blowfish_context_encrypt_block"; |
682 | 72 | uint32_t value_32bit = 0; |
683 | 72 | uint32_t value_left = 0; |
684 | 72 | uint32_t value_right = 0; |
685 | 72 | uint8_t byte_value1 = 0; |
686 | 72 | uint8_t byte_value2 = 0; |
687 | 72 | uint8_t byte_value3 = 0; |
688 | 72 | uint8_t byte_value4 = 0; |
689 | 72 | uint8_t encryption_round = 0; |
690 | | |
691 | 72 | if( internal_context == NULL ) |
692 | 0 | { |
693 | 0 | libcerror_error_set( |
694 | 0 | error, |
695 | 0 | LIBCERROR_ERROR_DOMAIN_ARGUMENTS, |
696 | 0 | LIBCERROR_ARGUMENT_ERROR_INVALID_VALUE, |
697 | 0 | "%s: invalid context.", |
698 | 0 | function ); |
699 | |
|
700 | 0 | return( -1 ); |
701 | 0 | } |
702 | 72 | if( input_data == NULL ) |
703 | 0 | { |
704 | 0 | libcerror_error_set( |
705 | 0 | error, |
706 | 0 | LIBCERROR_ERROR_DOMAIN_ARGUMENTS, |
707 | 0 | LIBCERROR_ARGUMENT_ERROR_INVALID_VALUE, |
708 | 0 | "%s: invalid input data.", |
709 | 0 | function ); |
710 | |
|
711 | 0 | return( -1 ); |
712 | 0 | } |
713 | 72 | if( ( input_data_size < 8 ) |
714 | 72 | || ( input_data_size > (size_t) SSIZE_MAX ) ) |
715 | 0 | { |
716 | 0 | libcerror_error_set( |
717 | 0 | error, |
718 | 0 | LIBCERROR_ERROR_DOMAIN_ARGUMENTS, |
719 | 0 | LIBCERROR_ARGUMENT_ERROR_VALUE_OUT_OF_BOUNDS, |
720 | 0 | "%s: invalid input data size value out of bounds.", |
721 | 0 | function ); |
722 | |
|
723 | 0 | return( -1 ); |
724 | 0 | } |
725 | 72 | if( output_data == NULL ) |
726 | 0 | { |
727 | 0 | libcerror_error_set( |
728 | 0 | error, |
729 | 0 | LIBCERROR_ERROR_DOMAIN_ARGUMENTS, |
730 | 0 | LIBCERROR_ARGUMENT_ERROR_INVALID_VALUE, |
731 | 0 | "%s: invalid output data.", |
732 | 0 | function ); |
733 | |
|
734 | 0 | return( -1 ); |
735 | 0 | } |
736 | 72 | if( ( output_data_size < 8 ) |
737 | 72 | || ( output_data_size > (size_t) SSIZE_MAX ) ) |
738 | 0 | { |
739 | 0 | libcerror_error_set( |
740 | 0 | error, |
741 | 0 | LIBCERROR_ERROR_DOMAIN_ARGUMENTS, |
742 | 0 | LIBCERROR_ARGUMENT_ERROR_VALUE_OUT_OF_BOUNDS, |
743 | 0 | "%s: invalid output data size value out of bounds.", |
744 | 0 | function ); |
745 | |
|
746 | 0 | return( -1 ); |
747 | 0 | } |
748 | 72 | byte_stream_copy_to_uint32_big_endian( |
749 | 72 | &( input_data[ 0 ] ), |
750 | 72 | value_left ); |
751 | | |
752 | 72 | byte_stream_copy_to_uint32_big_endian( |
753 | 72 | &( input_data[ 4 ] ), |
754 | 72 | value_right ); |
755 | | |
756 | 72 | for( encryption_round = 0; |
757 | 1.22k | encryption_round < 16; |
758 | 1.15k | encryption_round++ ) |
759 | 1.15k | { |
760 | 1.15k | value_left ^= internal_context->permutation_values[ encryption_round ]; |
761 | | |
762 | 1.15k | byte_value4 = (uint8_t) ( value_left & 0x000000ffUL ); |
763 | 1.15k | byte_value3 = (uint8_t) ( ( value_left >> 8 ) & 0x000000ffUL ); |
764 | 1.15k | byte_value2 = (uint8_t) ( ( value_left >> 16 ) & 0x000000ffUL ); |
765 | 1.15k | byte_value1 = (uint8_t) ( ( value_left >> 24 ) & 0x000000ffUL ); |
766 | | |
767 | 1.15k | value_32bit = internal_context->sboxes[ 0 ][ byte_value1 ]; |
768 | 1.15k | value_32bit += internal_context->sboxes[ 1 ][ byte_value2 ]; |
769 | 1.15k | value_32bit ^= internal_context->sboxes[ 2 ][ byte_value3 ]; |
770 | 1.15k | value_32bit += internal_context->sboxes[ 3 ][ byte_value4 ]; |
771 | | |
772 | 1.15k | value_right ^= value_32bit; |
773 | | |
774 | 1.15k | value_32bit = value_left; |
775 | 1.15k | value_left = value_right; |
776 | 1.15k | value_right = value_32bit; |
777 | 1.15k | } |
778 | 72 | value_32bit = value_left; |
779 | 72 | value_left = value_right; |
780 | 72 | value_right = value_32bit; |
781 | | |
782 | 72 | value_right ^= internal_context->permutation_values[ 16 ]; |
783 | 72 | value_left ^= internal_context->permutation_values[ 17 ]; |
784 | | |
785 | 72 | byte_stream_copy_from_uint32_big_endian( |
786 | 72 | &( output_data[ 0 ] ), |
787 | 72 | value_left ); |
788 | | |
789 | 72 | byte_stream_copy_from_uint32_big_endian( |
790 | 72 | &( output_data[ 4 ] ), |
791 | 72 | value_right ); |
792 | | |
793 | 72 | return( 1 ); |
794 | 72 | } |
795 | | |
796 | | /* Decrypt a block of data using Blowfish |
797 | | * The size must be a multitude of the Blowfish block size (8 byte) |
798 | | * Returns 1 if successful or -1 on error |
799 | | */ |
800 | | int libfcrypto_internal_blowfish_context_decrypt_block( |
801 | | libfcrypto_internal_blowfish_context_t *internal_context, |
802 | | const uint8_t *input_data, |
803 | | size_t input_data_size, |
804 | | uint8_t *output_data, |
805 | | size_t output_data_size, |
806 | | libcerror_error_t **error ) |
807 | 0 | { |
808 | 0 | static char *function = "libfcrypto_internal_blowfish_context_decrypt_block"; |
809 | 0 | uint32_t value_32bit = 0; |
810 | 0 | uint32_t value_left = 0; |
811 | 0 | uint32_t value_right = 0; |
812 | 0 | uint8_t byte_value1 = 0; |
813 | 0 | uint8_t byte_value2 = 0; |
814 | 0 | uint8_t byte_value3 = 0; |
815 | 0 | uint8_t byte_value4 = 0; |
816 | 0 | uint8_t encryption_round = 0; |
817 | |
|
818 | 0 | if( internal_context == NULL ) |
819 | 0 | { |
820 | 0 | libcerror_error_set( |
821 | 0 | error, |
822 | 0 | LIBCERROR_ERROR_DOMAIN_ARGUMENTS, |
823 | 0 | LIBCERROR_ARGUMENT_ERROR_INVALID_VALUE, |
824 | 0 | "%s: invalid context.", |
825 | 0 | function ); |
826 | |
|
827 | 0 | return( -1 ); |
828 | 0 | } |
829 | 0 | if( input_data == NULL ) |
830 | 0 | { |
831 | 0 | libcerror_error_set( |
832 | 0 | error, |
833 | 0 | LIBCERROR_ERROR_DOMAIN_ARGUMENTS, |
834 | 0 | LIBCERROR_ARGUMENT_ERROR_INVALID_VALUE, |
835 | 0 | "%s: invalid input data.", |
836 | 0 | function ); |
837 | |
|
838 | 0 | return( -1 ); |
839 | 0 | } |
840 | 0 | if( ( input_data_size < 8 ) |
841 | 0 | || ( input_data_size > (size_t) SSIZE_MAX ) ) |
842 | 0 | { |
843 | 0 | libcerror_error_set( |
844 | 0 | error, |
845 | 0 | LIBCERROR_ERROR_DOMAIN_ARGUMENTS, |
846 | 0 | LIBCERROR_ARGUMENT_ERROR_VALUE_OUT_OF_BOUNDS, |
847 | 0 | "%s: invalid input data size value out of bounds.", |
848 | 0 | function ); |
849 | |
|
850 | 0 | return( -1 ); |
851 | 0 | } |
852 | 0 | if( output_data == NULL ) |
853 | 0 | { |
854 | 0 | libcerror_error_set( |
855 | 0 | error, |
856 | 0 | LIBCERROR_ERROR_DOMAIN_ARGUMENTS, |
857 | 0 | LIBCERROR_ARGUMENT_ERROR_INVALID_VALUE, |
858 | 0 | "%s: invalid output data.", |
859 | 0 | function ); |
860 | |
|
861 | 0 | return( -1 ); |
862 | 0 | } |
863 | 0 | if( ( output_data_size < 8 ) |
864 | 0 | || ( output_data_size > (size_t) SSIZE_MAX ) ) |
865 | 0 | { |
866 | 0 | libcerror_error_set( |
867 | 0 | error, |
868 | 0 | LIBCERROR_ERROR_DOMAIN_ARGUMENTS, |
869 | 0 | LIBCERROR_ARGUMENT_ERROR_VALUE_OUT_OF_BOUNDS, |
870 | 0 | "%s: invalid output data size value out of bounds.", |
871 | 0 | function ); |
872 | |
|
873 | 0 | return( -1 ); |
874 | 0 | } |
875 | 0 | byte_stream_copy_to_uint32_big_endian( |
876 | 0 | &( input_data[ 0 ] ), |
877 | 0 | value_left ); |
878 | |
|
879 | 0 | byte_stream_copy_to_uint32_big_endian( |
880 | 0 | &( input_data[ 4 ] ), |
881 | 0 | value_right ); |
882 | |
|
883 | 0 | for( encryption_round = 17; |
884 | 0 | encryption_round > 1; |
885 | 0 | encryption_round-- ) |
886 | 0 | { |
887 | 0 | value_left ^= internal_context->permutation_values[ encryption_round ]; |
888 | |
|
889 | 0 | byte_value4 = (uint8_t) ( value_left & 0x000000ffUL ); |
890 | 0 | byte_value3 = (uint8_t) ( ( value_left >> 8 ) & 0x000000ffUL ); |
891 | 0 | byte_value2 = (uint8_t) ( ( value_left >> 16 ) & 0x000000ffUL ); |
892 | 0 | byte_value1 = (uint8_t) ( ( value_left >> 24 ) & 0x000000ffUL ); |
893 | |
|
894 | 0 | value_32bit = internal_context->sboxes[ 0 ][ byte_value1 ]; |
895 | 0 | value_32bit += internal_context->sboxes[ 1 ][ byte_value2 ]; |
896 | 0 | value_32bit ^= internal_context->sboxes[ 2 ][ byte_value3 ]; |
897 | 0 | value_32bit += internal_context->sboxes[ 3 ][ byte_value4 ]; |
898 | |
|
899 | 0 | value_right ^= value_32bit; |
900 | |
|
901 | 0 | value_32bit = value_left; |
902 | 0 | value_left = value_right; |
903 | 0 | value_right = value_32bit; |
904 | 0 | } |
905 | 0 | value_32bit = value_left; |
906 | 0 | value_left = value_right; |
907 | 0 | value_right = value_32bit; |
908 | |
|
909 | 0 | value_right ^= internal_context->permutation_values[ 1 ]; |
910 | 0 | value_left ^= internal_context->permutation_values[ 0 ]; |
911 | |
|
912 | 0 | byte_stream_copy_from_uint32_big_endian( |
913 | 0 | &( output_data[ 0 ] ), |
914 | 0 | value_left ); |
915 | |
|
916 | 0 | byte_stream_copy_from_uint32_big_endian( |
917 | 0 | &( output_data[ 4 ] ), |
918 | 0 | value_right ); |
919 | |
|
920 | 0 | return( 1 ); |
921 | 0 | } |
922 | | |
923 | | /* De- or encrypts a block of data using Blowfish-CBC (Cipher Block Chaining) |
924 | | * The size must be a multitude of the Blowfish block size (8 byte) |
925 | | * Returns 1 if successful or -1 on error |
926 | | */ |
927 | | int libfcrypto_blowfish_crypt_cbc( |
928 | | libfcrypto_blowfish_context_t *context, |
929 | | int mode, |
930 | | const uint8_t *initialization_vector, |
931 | | size_t initialization_vector_size, |
932 | | const uint8_t *input_data, |
933 | | size_t input_data_size, |
934 | | uint8_t *output_data, |
935 | | size_t output_data_size, |
936 | | libcerror_error_t **error ) |
937 | 56 | { |
938 | 56 | uint8_t block_data[ 8 ]; |
939 | 56 | uint8_t internal_initialization_vector[ 8 ]; |
940 | | |
941 | 56 | static char *function = "libfcrypto_blowfish_context_crypt_cbc"; |
942 | 56 | size_t data_offset = 0; |
943 | | |
944 | 56 | #if !defined( LIBFCRYPTO_UNFOLLED_LOOPS ) |
945 | 56 | uint8_t block_index = 0; |
946 | 56 | #endif |
947 | | |
948 | 56 | if( context == NULL ) |
949 | 0 | { |
950 | 0 | libcerror_error_set( |
951 | 0 | error, |
952 | 0 | LIBCERROR_ERROR_DOMAIN_ARGUMENTS, |
953 | 0 | LIBCERROR_ARGUMENT_ERROR_INVALID_VALUE, |
954 | 0 | "%s: invalid context.", |
955 | 0 | function ); |
956 | |
|
957 | 0 | return( -1 ); |
958 | 0 | } |
959 | 56 | if( initialization_vector == NULL ) |
960 | 0 | { |
961 | 0 | libcerror_error_set( |
962 | 0 | error, |
963 | 0 | LIBCERROR_ERROR_DOMAIN_ARGUMENTS, |
964 | 0 | LIBCERROR_ARGUMENT_ERROR_INVALID_VALUE, |
965 | 0 | "%s: invalid initialization vector.", |
966 | 0 | function ); |
967 | |
|
968 | 0 | return( -1 ); |
969 | 0 | } |
970 | 56 | if( initialization_vector_size != 8 ) |
971 | 0 | { |
972 | 0 | libcerror_error_set( |
973 | 0 | error, |
974 | 0 | LIBCERROR_ERROR_DOMAIN_ARGUMENTS, |
975 | 0 | LIBCERROR_ARGUMENT_ERROR_VALUE_OUT_OF_BOUNDS, |
976 | 0 | "%s: invalid initialization vector size value out of bounds.", |
977 | 0 | function ); |
978 | |
|
979 | 0 | return( -1 ); |
980 | 0 | } |
981 | 56 | if( ( mode != LIBFCRYPTO_BLOWFISH_CRYPT_MODE_ENCRYPT ) |
982 | 56 | && ( mode != LIBFCRYPTO_BLOWFISH_CRYPT_MODE_DECRYPT ) ) |
983 | 0 | { |
984 | 0 | libcerror_error_set( |
985 | 0 | error, |
986 | 0 | LIBCERROR_ERROR_DOMAIN_ARGUMENTS, |
987 | 0 | LIBCERROR_ARGUMENT_ERROR_UNSUPPORTED_VALUE, |
988 | 0 | "%s: unsupported mode.", |
989 | 0 | function ); |
990 | |
|
991 | 0 | return( -1 ); |
992 | 0 | } |
993 | 56 | if( input_data == NULL ) |
994 | 0 | { |
995 | 0 | libcerror_error_set( |
996 | 0 | error, |
997 | 0 | LIBCERROR_ERROR_DOMAIN_ARGUMENTS, |
998 | 0 | LIBCERROR_ARGUMENT_ERROR_INVALID_VALUE, |
999 | 0 | "%s: invalid input data.", |
1000 | 0 | function ); |
1001 | |
|
1002 | 0 | return( -1 ); |
1003 | 0 | } |
1004 | | /* Check if the input data size is a multitude of 8-byte |
1005 | | */ |
1006 | 56 | if( ( ( input_data_size & (size_t) 0x07 ) != 0 ) |
1007 | 56 | || ( input_data_size < 8 ) |
1008 | 56 | || ( input_data_size > (size_t) SSIZE_MAX ) ) |
1009 | 3 | { |
1010 | 3 | libcerror_error_set( |
1011 | 3 | error, |
1012 | 3 | LIBCERROR_ERROR_DOMAIN_ARGUMENTS, |
1013 | 3 | LIBCERROR_ARGUMENT_ERROR_VALUE_OUT_OF_BOUNDS, |
1014 | 3 | "%s: invalid input data size value out of bounds.", |
1015 | 3 | function ); |
1016 | | |
1017 | 3 | return( -1 ); |
1018 | 3 | } |
1019 | 53 | if( output_data == NULL ) |
1020 | 0 | { |
1021 | 0 | libcerror_error_set( |
1022 | 0 | error, |
1023 | 0 | LIBCERROR_ERROR_DOMAIN_ARGUMENTS, |
1024 | 0 | LIBCERROR_ARGUMENT_ERROR_INVALID_VALUE, |
1025 | 0 | "%s: invalid output data.", |
1026 | 0 | function ); |
1027 | |
|
1028 | 0 | return( -1 ); |
1029 | 0 | } |
1030 | 53 | if( ( output_data_size < input_data_size ) |
1031 | 53 | || ( output_data_size > (size_t) SSIZE_MAX ) ) |
1032 | 45 | { |
1033 | 45 | libcerror_error_set( |
1034 | 45 | error, |
1035 | 45 | LIBCERROR_ERROR_DOMAIN_ARGUMENTS, |
1036 | 45 | LIBCERROR_ARGUMENT_ERROR_VALUE_OUT_OF_BOUNDS, |
1037 | 45 | "%s: invalid output data size value out of bounds.", |
1038 | 45 | function ); |
1039 | | |
1040 | 45 | return( -1 ); |
1041 | 45 | } |
1042 | 8 | if( memory_copy( |
1043 | 8 | internal_initialization_vector, |
1044 | 8 | initialization_vector, |
1045 | 8 | 8 ) == NULL ) |
1046 | 0 | { |
1047 | 0 | libcerror_error_set( |
1048 | 0 | error, |
1049 | 0 | LIBCERROR_ERROR_DOMAIN_MEMORY, |
1050 | 0 | LIBCERROR_MEMORY_ERROR_COPY_FAILED, |
1051 | 0 | "%s: unable to copy initialization vector.", |
1052 | 0 | function ); |
1053 | |
|
1054 | 0 | goto on_error; |
1055 | 0 | } |
1056 | 44 | while( data_offset < input_data_size ) |
1057 | 36 | { |
1058 | 36 | if( mode == LIBFCRYPTO_BLOWFISH_CRYPT_MODE_ENCRYPT ) |
1059 | 36 | { |
1060 | | #if defined( LIBFCRYPTO_UNFOLLED_LOOPS ) |
1061 | | block_data[ 0 ] = input_data[ data_offset++ ] ^ internal_initialization_vector[ 0 ]; |
1062 | | block_data[ 1 ] = input_data[ data_offset++ ] ^ internal_initialization_vector[ 1 ]; |
1063 | | block_data[ 2 ] = input_data[ data_offset++ ] ^ internal_initialization_vector[ 2 ]; |
1064 | | block_data[ 3 ] = input_data[ data_offset++ ] ^ internal_initialization_vector[ 3 ]; |
1065 | | block_data[ 4 ] = input_data[ data_offset++ ] ^ internal_initialization_vector[ 4 ]; |
1066 | | block_data[ 5 ] = input_data[ data_offset++ ] ^ internal_initialization_vector[ 5 ]; |
1067 | | block_data[ 6 ] = input_data[ data_offset++ ] ^ internal_initialization_vector[ 6 ]; |
1068 | | block_data[ 7 ] = input_data[ data_offset++ ] ^ internal_initialization_vector[ 7 ]; |
1069 | | #else |
1070 | 36 | for( block_index = 0; |
1071 | 324 | block_index < 8; |
1072 | 288 | block_index++ ) |
1073 | 288 | { |
1074 | 288 | block_data[ block_index ] = input_data[ data_offset++ ] ^ internal_initialization_vector[ block_index ]; |
1075 | 288 | } |
1076 | 36 | #endif |
1077 | 36 | data_offset -= 8; |
1078 | | |
1079 | 36 | if( libfcrypto_internal_blowfish_context_encrypt_block( |
1080 | 36 | (libfcrypto_internal_blowfish_context_t *) context, |
1081 | 36 | block_data, |
1082 | 36 | 8, |
1083 | 36 | &( output_data[ data_offset ] ), |
1084 | 36 | 8, |
1085 | 36 | error ) != 1 ) |
1086 | 0 | { |
1087 | 0 | libcerror_error_set( |
1088 | 0 | error, |
1089 | 0 | LIBCERROR_ERROR_DOMAIN_ENCRYPTION, |
1090 | 0 | LIBCERROR_ENCRYPTION_ERROR_GENERIC, |
1091 | 0 | "%s: unable to encrypt input data.", |
1092 | 0 | function ); |
1093 | |
|
1094 | 0 | goto on_error; |
1095 | 0 | } |
1096 | 36 | if( memory_copy( |
1097 | 36 | internal_initialization_vector, |
1098 | 36 | &( output_data[ data_offset ] ), |
1099 | 36 | 8 ) == NULL ) |
1100 | 0 | { |
1101 | 0 | libcerror_error_set( |
1102 | 0 | error, |
1103 | 0 | LIBCERROR_ERROR_DOMAIN_MEMORY, |
1104 | 0 | LIBCERROR_MEMORY_ERROR_COPY_FAILED, |
1105 | 0 | "%s: unable to copy encrypted output data to initialization vector.", |
1106 | 0 | function ); |
1107 | |
|
1108 | 0 | goto on_error; |
1109 | 0 | } |
1110 | 36 | } |
1111 | 0 | else |
1112 | 0 | { |
1113 | 0 | if( libfcrypto_internal_blowfish_context_decrypt_block( |
1114 | 0 | (libfcrypto_internal_blowfish_context_t *) context, |
1115 | 0 | &( input_data[ data_offset ] ), |
1116 | 0 | 8, |
1117 | 0 | &( output_data[ data_offset ] ), |
1118 | 0 | 8, |
1119 | 0 | error ) != 1 ) |
1120 | 0 | { |
1121 | 0 | libcerror_error_set( |
1122 | 0 | error, |
1123 | 0 | LIBCERROR_ERROR_DOMAIN_ENCRYPTION, |
1124 | 0 | LIBCERROR_ENCRYPTION_ERROR_GENERIC, |
1125 | 0 | "%s: unable to decrypt input data.", |
1126 | 0 | function ); |
1127 | |
|
1128 | 0 | goto on_error; |
1129 | 0 | } |
1130 | | #if defined( LIBFCRYPTO_UNFOLLED_LOOPS ) |
1131 | | output_data[ data_offset++ ] ^= internal_initialization_vector[ 0 ]; |
1132 | | output_data[ data_offset++ ] ^= internal_initialization_vector[ 1 ]; |
1133 | | output_data[ data_offset++ ] ^= internal_initialization_vector[ 2 ]; |
1134 | | output_data[ data_offset++ ] ^= internal_initialization_vector[ 3 ]; |
1135 | | output_data[ data_offset++ ] ^= internal_initialization_vector[ 4 ]; |
1136 | | output_data[ data_offset++ ] ^= internal_initialization_vector[ 5 ]; |
1137 | | output_data[ data_offset++ ] ^= internal_initialization_vector[ 6 ]; |
1138 | | output_data[ data_offset++ ] ^= internal_initialization_vector[ 7 ]; |
1139 | | #else |
1140 | 0 | for( block_index = 0; |
1141 | 0 | block_index < 8; |
1142 | 0 | block_index++ ) |
1143 | 0 | { |
1144 | 0 | output_data[ data_offset++ ] ^= internal_initialization_vector[ block_index ]; |
1145 | 0 | } |
1146 | 0 | #endif |
1147 | 0 | data_offset -= 8; |
1148 | |
|
1149 | 0 | if( memory_copy( |
1150 | 0 | internal_initialization_vector, |
1151 | 0 | &( input_data[ data_offset ] ), |
1152 | 0 | 8 ) == NULL ) |
1153 | 0 | { |
1154 | 0 | libcerror_error_set( |
1155 | 0 | error, |
1156 | 0 | LIBCERROR_ERROR_DOMAIN_MEMORY, |
1157 | 0 | LIBCERROR_MEMORY_ERROR_COPY_FAILED, |
1158 | 0 | "%s: unable to copy encrypted input data to initialization vector.", |
1159 | 0 | function ); |
1160 | |
|
1161 | 0 | goto on_error; |
1162 | 0 | } |
1163 | 0 | } |
1164 | 36 | data_offset += 8; |
1165 | 36 | } |
1166 | 8 | if( memory_set( |
1167 | 8 | internal_initialization_vector, |
1168 | 8 | 0, |
1169 | 8 | 8 ) == NULL ) |
1170 | 0 | { |
1171 | 0 | libcerror_error_set( |
1172 | 0 | error, |
1173 | 0 | LIBCERROR_ERROR_DOMAIN_MEMORY, |
1174 | 0 | LIBCERROR_MEMORY_ERROR_SET_FAILED, |
1175 | 0 | "%s: unable to clear initialization vector.", |
1176 | 0 | function ); |
1177 | |
|
1178 | 0 | goto on_error; |
1179 | 0 | } |
1180 | 8 | if( memory_set( |
1181 | 8 | block_data, |
1182 | 8 | 0, |
1183 | 8 | 8 ) == NULL ) |
1184 | 0 | { |
1185 | 0 | libcerror_error_set( |
1186 | 0 | error, |
1187 | 0 | LIBCERROR_ERROR_DOMAIN_MEMORY, |
1188 | 0 | LIBCERROR_MEMORY_ERROR_SET_FAILED, |
1189 | 0 | "%s: unable to clear block data.", |
1190 | 0 | function ); |
1191 | |
|
1192 | 0 | goto on_error; |
1193 | 0 | } |
1194 | 8 | return( 1 ); |
1195 | | |
1196 | 0 | on_error: |
1197 | 0 | memory_set( |
1198 | 0 | internal_initialization_vector, |
1199 | 0 | 0, |
1200 | 0 | 8 ); |
1201 | |
|
1202 | 0 | memory_set( |
1203 | 0 | block_data, |
1204 | 0 | 0, |
1205 | 0 | 8 ); |
1206 | |
|
1207 | 0 | return( -1 ); |
1208 | 8 | } |
1209 | | |
1210 | | /* De- or encrypts a block of data using Blowfish-ECB (Electronic CodeBook) |
1211 | | * The size must be a multitude of the Blowfish block size (8 byte) |
1212 | | * Returns 1 if successful or -1 on error |
1213 | | */ |
1214 | | int libfcrypto_blowfish_crypt_ecb( |
1215 | | libfcrypto_blowfish_context_t *context, |
1216 | | int mode, |
1217 | | const uint8_t *input_data, |
1218 | | size_t input_data_size, |
1219 | | uint8_t *output_data, |
1220 | | size_t output_data_size, |
1221 | | libcerror_error_t **error ) |
1222 | 56 | { |
1223 | 56 | static char *function = "libfcrypto_blowfish_context_crypt_ecb"; |
1224 | 56 | size_t data_offset = 0; |
1225 | | |
1226 | 56 | if( context == NULL ) |
1227 | 0 | { |
1228 | 0 | libcerror_error_set( |
1229 | 0 | error, |
1230 | 0 | LIBCERROR_ERROR_DOMAIN_ARGUMENTS, |
1231 | 0 | LIBCERROR_ARGUMENT_ERROR_INVALID_VALUE, |
1232 | 0 | "%s: invalid context.", |
1233 | 0 | function ); |
1234 | |
|
1235 | 0 | return( -1 ); |
1236 | 0 | } |
1237 | 56 | if( ( mode != LIBFCRYPTO_BLOWFISH_CRYPT_MODE_ENCRYPT ) |
1238 | 56 | && ( mode != LIBFCRYPTO_BLOWFISH_CRYPT_MODE_DECRYPT ) ) |
1239 | 0 | { |
1240 | 0 | libcerror_error_set( |
1241 | 0 | error, |
1242 | 0 | LIBCERROR_ERROR_DOMAIN_ARGUMENTS, |
1243 | 0 | LIBCERROR_ARGUMENT_ERROR_UNSUPPORTED_VALUE, |
1244 | 0 | "%s: unsupported mode.", |
1245 | 0 | function ); |
1246 | |
|
1247 | 0 | return( -1 ); |
1248 | 0 | } |
1249 | 56 | if( input_data == NULL ) |
1250 | 0 | { |
1251 | 0 | libcerror_error_set( |
1252 | 0 | error, |
1253 | 0 | LIBCERROR_ERROR_DOMAIN_ARGUMENTS, |
1254 | 0 | LIBCERROR_ARGUMENT_ERROR_INVALID_VALUE, |
1255 | 0 | "%s: invalid input data.", |
1256 | 0 | function ); |
1257 | |
|
1258 | 0 | return( -1 ); |
1259 | 0 | } |
1260 | | /* Check if the input data size is a multitude of 8-byte |
1261 | | */ |
1262 | 56 | if( ( ( input_data_size & (size_t) 0x07 ) != 0 ) |
1263 | 56 | || ( input_data_size < 8 ) |
1264 | 56 | || ( input_data_size > (size_t) SSIZE_MAX ) ) |
1265 | 3 | { |
1266 | 3 | libcerror_error_set( |
1267 | 3 | error, |
1268 | 3 | LIBCERROR_ERROR_DOMAIN_ARGUMENTS, |
1269 | 3 | LIBCERROR_ARGUMENT_ERROR_VALUE_OUT_OF_BOUNDS, |
1270 | 3 | "%s: invalid input data size value out of bounds.", |
1271 | 3 | function ); |
1272 | | |
1273 | 3 | return( -1 ); |
1274 | 3 | } |
1275 | 53 | if( output_data == NULL ) |
1276 | 0 | { |
1277 | 0 | libcerror_error_set( |
1278 | 0 | error, |
1279 | 0 | LIBCERROR_ERROR_DOMAIN_ARGUMENTS, |
1280 | 0 | LIBCERROR_ARGUMENT_ERROR_INVALID_VALUE, |
1281 | 0 | "%s: invalid output data.", |
1282 | 0 | function ); |
1283 | |
|
1284 | 0 | return( -1 ); |
1285 | 0 | } |
1286 | 53 | if( ( output_data_size < input_data_size ) |
1287 | 53 | || ( output_data_size > (size_t) SSIZE_MAX ) ) |
1288 | 45 | { |
1289 | 45 | libcerror_error_set( |
1290 | 45 | error, |
1291 | 45 | LIBCERROR_ERROR_DOMAIN_ARGUMENTS, |
1292 | 45 | LIBCERROR_ARGUMENT_ERROR_VALUE_OUT_OF_BOUNDS, |
1293 | 45 | "%s: invalid output data size value out of bounds.", |
1294 | 45 | function ); |
1295 | | |
1296 | 45 | return( -1 ); |
1297 | 45 | } |
1298 | 44 | while( data_offset < input_data_size ) |
1299 | 36 | { |
1300 | 36 | if( mode == LIBFCRYPTO_BLOWFISH_CRYPT_MODE_ENCRYPT ) |
1301 | 36 | { |
1302 | 36 | if( libfcrypto_internal_blowfish_context_encrypt_block( |
1303 | 36 | (libfcrypto_internal_blowfish_context_t *) context, |
1304 | 36 | &( input_data[ data_offset ] ), |
1305 | 36 | 8, |
1306 | 36 | &( output_data[ data_offset ] ), |
1307 | 36 | 8, |
1308 | 36 | error ) != 1 ) |
1309 | 0 | { |
1310 | 0 | libcerror_error_set( |
1311 | 0 | error, |
1312 | 0 | LIBCERROR_ERROR_DOMAIN_ENCRYPTION, |
1313 | 0 | LIBCERROR_ENCRYPTION_ERROR_GENERIC, |
1314 | 0 | "%s: unable to encrypt input data.", |
1315 | 0 | function ); |
1316 | |
|
1317 | 0 | return( -1 ); |
1318 | 0 | } |
1319 | 36 | } |
1320 | 0 | else |
1321 | 0 | { |
1322 | 0 | if( libfcrypto_internal_blowfish_context_decrypt_block( |
1323 | 0 | (libfcrypto_internal_blowfish_context_t *) context, |
1324 | 0 | &( input_data[ data_offset ] ), |
1325 | 0 | 8, |
1326 | 0 | &( output_data[ data_offset ] ), |
1327 | 0 | 8, |
1328 | 0 | error ) != 1 ) |
1329 | 0 | { |
1330 | 0 | libcerror_error_set( |
1331 | 0 | error, |
1332 | 0 | LIBCERROR_ERROR_DOMAIN_ENCRYPTION, |
1333 | 0 | LIBCERROR_ENCRYPTION_ERROR_GENERIC, |
1334 | 0 | "%s: unable to decrypt input data.", |
1335 | 0 | function ); |
1336 | |
|
1337 | 0 | return( -1 ); |
1338 | 0 | } |
1339 | 0 | } |
1340 | 36 | data_offset += 8; |
1341 | 36 | } |
1342 | 8 | return( 1 ); |
1343 | 8 | } |
1344 | | |