Deleted Added
full compact
g_bde_lock.c (105464) g_bde_lock.c (105512)
1/*-
2 * Copyright (c) 2002 Poul-Henning Kamp
3 * Copyright (c) 2002 Networks Associates Technology, Inc.
4 * All rights reserved.
5 *
6 * This software was developed for the FreeBSD Project by Poul-Henning Kamp
7 * and NAI Labs, the Security Research Division of Network Associates, Inc.
8 * under DARPA/SPAWAR contract N66001-01-C-8035 ("CBOSS"), as part of the

--- 18 unchanged lines hidden (view full) ---

27 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33 * SUCH DAMAGE.
34 *
1/*-
2 * Copyright (c) 2002 Poul-Henning Kamp
3 * Copyright (c) 2002 Networks Associates Technology, Inc.
4 * All rights reserved.
5 *
6 * This software was developed for the FreeBSD Project by Poul-Henning Kamp
7 * and NAI Labs, the Security Research Division of Network Associates, Inc.
8 * under DARPA/SPAWAR contract N66001-01-C-8035 ("CBOSS"), as part of the

--- 18 unchanged lines hidden (view full) ---

27 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33 * SUCH DAMAGE.
34 *
35 * $FreeBSD: head/sys/geom/bde/g_bde_lock.c 105464 2002-10-19 17:02:17Z phk $
35 * $FreeBSD: head/sys/geom/bde/g_bde_lock.c 105512 2002-10-20 11:09:58Z phk $
36 *
37 * This souce file contains routines which operates on the lock sectors, both
38 * for the kernel and the userland program gbde(1).
39 *
40 */
41
42#include <sys/param.h>
43#include <sys/queue.h>

--- 94 unchanged lines hidden (view full) ---

138 u_char *p;
139
140 p = ptr;
141 while (len--)
142 *p++ = g_bde_arc4(sc);
143}
144
145void
36 *
37 * This souce file contains routines which operates on the lock sectors, both
38 * for the kernel and the userland program gbde(1).
39 *
40 */
41
42#include <sys/param.h>
43#include <sys/queue.h>

--- 94 unchanged lines hidden (view full) ---

138 u_char *p;
139
140 p = ptr;
141 while (len--)
142 *p++ = g_bde_arc4(sc);
143}
144
145void
146g_bde_arc4_seed(struct g_bde_softc *sc, void *ptr, u_int len)
146g_bde_arc4_seed(struct g_bde_softc *sc, const void *ptr, u_int len)
147{
147{
148 u_char k[256], *p, c;
148 u_char k[256], c;
149 const u_char *p;
149 u_int i;
150
151 p = ptr;
152 sc->arc4_i = 0;
153 bzero(k, sizeof k);
154 while(len--)
155 k[sc->arc4_i++] ^= *p++;
156

--- 18 unchanged lines hidden (view full) ---

175g_bde_keyloc_encrypt(struct g_bde_softc *sc, void *input, void *output)
176{
177 u_char *p;
178 u_char buf[16], buf1[16];
179 u_int i;
180 keyInstance ki;
181 cipherInstance ci;
182
150 u_int i;
151
152 p = ptr;
153 sc->arc4_i = 0;
154 bzero(k, sizeof k);
155 while(len--)
156 k[sc->arc4_i++] ^= *p++;
157

--- 18 unchanged lines hidden (view full) ---

176g_bde_keyloc_encrypt(struct g_bde_softc *sc, void *input, void *output)
177{
178 u_char *p;
179 u_char buf[16], buf1[16];
180 u_int i;
181 keyInstance ki;
182 cipherInstance ci;
183
184 bcopy(input, output, 16);
185 return 0;
183 rijndael_cipherInit(&ci, MODE_CBC, NULL);
184 p = input;
185 g_bde_arc4_seq(sc, buf, sizeof buf);
186 for (i = 0; i < sizeof buf; i++)
187 buf1[i] = p[i] ^ buf[i];
188 g_bde_arc4_seq(sc, buf, sizeof buf);
189 rijndael_makeKey(&ki, DIR_ENCRYPT, G_BDE_KKEYBITS, buf);
190 rijndael_blockEncrypt(&ci, &ki, buf1, 16 * 8, output);
191 bzero(&ci, sizeof ci);
186 rijndael_cipherInit(&ci, MODE_CBC, NULL);
187 p = input;
188 g_bde_arc4_seq(sc, buf, sizeof buf);
189 for (i = 0; i < sizeof buf; i++)
190 buf1[i] = p[i] ^ buf[i];
191 g_bde_arc4_seq(sc, buf, sizeof buf);
192 rijndael_makeKey(&ki, DIR_ENCRYPT, G_BDE_KKEYBITS, buf);
193 rijndael_blockEncrypt(&ci, &ki, buf1, 16 * 8, output);
194 bzero(&ci, sizeof ci);
195 bzero(&ki, sizeof ki);
192 return (0);
193}
194
195int
196g_bde_keyloc_decrypt(struct g_bde_softc *sc, void *input, void *output)
197{
198 u_char *p;
199 u_char buf1[16], buf2[16];
200 u_int i;
201 keyInstance ki;
202 cipherInstance ci;
203
196 return (0);
197}
198
199int
200g_bde_keyloc_decrypt(struct g_bde_softc *sc, void *input, void *output)
201{
202 u_char *p;
203 u_char buf1[16], buf2[16];
204 u_int i;
205 keyInstance ki;
206 cipherInstance ci;
207
208 bcopy(input, output, 16);
209 return 0;
204 rijndael_cipherInit(&ci, MODE_CBC, NULL);
205 g_bde_arc4_seq(sc, buf1, sizeof buf1);
206 g_bde_arc4_seq(sc, buf2, sizeof buf2);
207 rijndael_makeKey(&ki, DIR_DECRYPT, G_BDE_KKEYBITS, buf2);
208 rijndael_blockDecrypt(&ci, &ki, input, 16 * 8, output);
209 p = output;
210 for (i = 0; i < sizeof buf1; i++)
211 p[i] ^= buf1[i];
212 bzero(&ci, sizeof ci);
210 rijndael_cipherInit(&ci, MODE_CBC, NULL);
211 g_bde_arc4_seq(sc, buf1, sizeof buf1);
212 g_bde_arc4_seq(sc, buf2, sizeof buf2);
213 rijndael_makeKey(&ki, DIR_DECRYPT, G_BDE_KKEYBITS, buf2);
214 rijndael_blockDecrypt(&ci, &ki, input, 16 * 8, output);
215 p = output;
216 for (i = 0; i < sizeof buf1; i++)
217 p[i] ^= buf1[i];
218 bzero(&ci, sizeof ci);
219 bzero(&ki, sizeof ki);
213 return (0);
214}
215
216/*
220 return (0);
221}
222
223/*
217 * Encode/Decode lock sectors.
224 * Encode/Decode lock sectors, do the real work.
218 */
219
225 */
226
220int
221g_bde_decrypt_lock(struct g_bde_softc *sc, u_char *sbox, u_char *meta, off_t mediasize, u_int sectorsize, u_int *nkey)
227static int
228g_bde_decrypt_lockx(struct g_bde_softc *sc, u_char *sbox, u_char *meta, off_t mediasize, u_int sectorsize, u_int *nkey)
222{
223 u_char *buf, k1buf[16], k2buf[G_BDE_LOCKSIZE], k3buf[16], *q;
224 struct g_bde_key *gl;
225 uint64_t off[2];
226 int error, m, i;
227 MD5_CTX c;
228 keyInstance ki;
229 cipherInstance ci;

--- 4 unchanged lines hidden (view full) ---

234 sc->arc4_j = 0;
235 gl = &sc->key;
236 error = g_bde_keyloc_decrypt(sc, meta, off);
237 if (error)
238 return(error);
239
240 if (off[0] + G_BDE_LOCKSIZE > (uint64_t)mediasize) {
241 bzero(off, sizeof off);
229{
230 u_char *buf, k1buf[16], k2buf[G_BDE_LOCKSIZE], k3buf[16], *q;
231 struct g_bde_key *gl;
232 uint64_t off[2];
233 int error, m, i;
234 MD5_CTX c;
235 keyInstance ki;
236 cipherInstance ci;

--- 4 unchanged lines hidden (view full) ---

241 sc->arc4_j = 0;
242 gl = &sc->key;
243 error = g_bde_keyloc_decrypt(sc, meta, off);
244 if (error)
245 return(error);
246
247 if (off[0] + G_BDE_LOCKSIZE > (uint64_t)mediasize) {
248 bzero(off, sizeof off);
242 return (ESRCH);
249 return (EINVAL);
243 }
244 off[1] = 0;
245 m = 1;
246 if (off[0] % sectorsize > sectorsize - G_BDE_LOCKSIZE)
247 m++;
248 buf = g_read_data(sc->consumer,
249 off[0] - (off[0] % sectorsize),
250 m * sectorsize, &error);
251 if (buf == NULL) {
252 off[0] = 0;
253 return(error);
254 }
255
256 q = buf + off[0] % sectorsize;
257
258 off[1] = 0;
250 }
251 off[1] = 0;
252 m = 1;
253 if (off[0] % sectorsize > sectorsize - G_BDE_LOCKSIZE)
254 m++;
255 buf = g_read_data(sc->consumer,
256 off[0] - (off[0] % sectorsize),
257 m * sectorsize, &error);
258 if (buf == NULL) {
259 off[0] = 0;
260 return(error);
261 }
262
263 q = buf + off[0] % sectorsize;
264
265 off[1] = 0;
259 for (i = 0; i < (int)sizeof(*gl); i++)
266 for (i = 0; i < G_BDE_LOCKSIZE; i++)
260 off[1] += q[i];
261
262 if (off[1] == 0) {
263 off[0] = 0;
264 g_free(buf);
265 return (ESRCH);
266 }
267

--- 14 unchanged lines hidden (view full) ---

282 q[i] ^= k2buf[i];
283 bzero(k2buf, sizeof k2buf);
284
285 if (bcmp(q, k1buf, sizeof k1buf)) {
286 bzero(k1buf, sizeof k1buf);
287 bzero(buf, sectorsize * m);
288 g_free(buf);
289 off[0] = 0;
267 off[1] += q[i];
268
269 if (off[1] == 0) {
270 off[0] = 0;
271 g_free(buf);
272 return (ESRCH);
273 }
274

--- 14 unchanged lines hidden (view full) ---

289 q[i] ^= k2buf[i];
290 bzero(k2buf, sizeof k2buf);
291
292 if (bcmp(q, k1buf, sizeof k1buf)) {
293 bzero(k1buf, sizeof k1buf);
294 bzero(buf, sectorsize * m);
295 g_free(buf);
296 off[0] = 0;
290 return (ESRCH);
297 return (ENOTDIR);
291 }
292 bzero(k1buf, sizeof k1buf);
293
294 g_bde_decode_lock(gl, q);
295 bzero(buf, sectorsize * m);
296 g_free(buf);
297
298 off[1] = 0;

--- 5 unchanged lines hidden (view full) ---

304 return (ENOENT);
305 }
306 for (i = 0; i < G_BDE_MAXKEYS; i++)
307 if (nkey != NULL && off[0] == gl->lsector[i])
308 *nkey = i;
309
310 return (0);
311}
298 }
299 bzero(k1buf, sizeof k1buf);
300
301 g_bde_decode_lock(gl, q);
302 bzero(buf, sectorsize * m);
303 g_free(buf);
304
305 off[1] = 0;

--- 5 unchanged lines hidden (view full) ---

311 return (ENOENT);
312 }
313 for (i = 0; i < G_BDE_MAXKEYS; i++)
314 if (nkey != NULL && off[0] == gl->lsector[i])
315 *nkey = i;
316
317 return (0);
318}
319
320/*
321 * Encode/Decode lock sectors.
322 */
323
324int
325g_bde_decrypt_lock(struct g_bde_softc *sc, u_char *sbox, u_char *meta, off_t mediasize, u_int sectorsize, u_int *nkey)
326{
327 u_char *buf, buf1[16];
328 int error, e, i;
329
330 bzero(buf1, sizeof buf1);
331 if (bcmp(buf1, meta, sizeof buf1))
332 return (g_bde_decrypt_lockx(sc, sbox, meta, mediasize,
333 sectorsize, nkey));
334
335 buf = g_read_data(sc->consumer, 0, sectorsize, &error);
336 if (buf == NULL)
337 return(error);
338 error = 0;
339 for (i = 0; i < G_BDE_MAXKEYS; i++) {
340 e = g_bde_decrypt_lockx(sc, sbox, buf + i * 16, mediasize,
341 sectorsize, nkey);
342 if (e == 0 || e == ENOENT) {
343 error = e;
344 break;
345 }
346 if (e == ESRCH)
347 error = ENOTDIR;
348 else if (e != 0)
349 error = e;
350 }
351 g_free(buf);
352 return (error);
353}