Deleted Added
sdiff udiff text old ( 105464 ) new ( 105512 )
full compact
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 $
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)
147{
148 u_char k[256], *p, c;
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
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);
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
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);
213 return (0);
214}
215
216/*
217 * Encode/Decode lock sectors.
218 */
219
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)
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);
242 return (ESRCH);
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;
259 for (i = 0; i < (int)sizeof(*gl); 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;
290 return (ESRCH);
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}