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} |
|