version 1.52, 2008/04/28 20:23:46 |
version 1.53, 2008/09/12 16:51:55 |
Line 486 cgddump(dev_t dev, daddr_t blkno, void * |
|
Line 486 cgddump(dev_t dev, daddr_t blkno, void * |
|
*/ |
*/ |
#define MAX_KEYSIZE 1024 |
#define MAX_KEYSIZE 1024 |
|
|
|
static const struct { |
|
const char *n; |
|
int v; |
|
int d; |
|
} encblkno[] = { |
|
{ "encblkno", CGD_CIPHER_CBC_ENCBLKNO8, 1 }, |
|
{ "encblkno8", CGD_CIPHER_CBC_ENCBLKNO8, 1 }, |
|
{ "encblkno1", CGD_CIPHER_CBC_ENCBLKNO1, 8 }, |
|
}; |
|
|
/* ARGSUSED */ |
/* ARGSUSED */ |
static int |
static int |
cgd_ioctl_set(struct cgd_softc *cs, void *data, struct lwp *l) |
cgd_ioctl_set(struct cgd_softc *cs, void *data, struct lwp *l) |
Line 493 cgd_ioctl_set(struct cgd_softc *cs, void |
|
Line 503 cgd_ioctl_set(struct cgd_softc *cs, void |
|
struct cgd_ioctl *ci = data; |
struct cgd_ioctl *ci = data; |
struct vnode *vp; |
struct vnode *vp; |
int ret; |
int ret; |
|
size_t i; |
size_t keybytes; /* key length in bytes */ |
size_t keybytes; /* key length in bytes */ |
const char *cp; |
const char *cp; |
char *inbuf; |
char *inbuf; |
Line 516 cgd_ioctl_set(struct cgd_softc *cs, void |
|
Line 527 cgd_ioctl_set(struct cgd_softc *cs, void |
|
goto bail; |
goto bail; |
} |
} |
|
|
/* right now we only support encblkno, so hard-code it */ |
|
(void)memset(inbuf, 0, MAX_KEYSIZE); |
(void)memset(inbuf, 0, MAX_KEYSIZE); |
ret = copyinstr(ci->ci_ivmethod, inbuf, MAX_KEYSIZE, NULL); |
ret = copyinstr(ci->ci_ivmethod, inbuf, MAX_KEYSIZE, NULL); |
if (ret) |
if (ret) |
goto bail; |
goto bail; |
if (strcmp("encblkno", inbuf)) { |
|
|
for (i = 0; i < __arraycount(encblkno); i++) |
|
if (strcmp(encblkno[i].n, inbuf) == 0) |
|
break; |
|
|
|
if (i == __arraycount(encblkno)) { |
ret = EINVAL; |
ret = EINVAL; |
goto bail; |
goto bail; |
} |
} |
Line 531 cgd_ioctl_set(struct cgd_softc *cs, void |
|
Line 546 cgd_ioctl_set(struct cgd_softc *cs, void |
|
ret = EINVAL; |
ret = EINVAL; |
goto bail; |
goto bail; |
} |
} |
|
|
(void)memset(inbuf, 0, MAX_KEYSIZE); |
(void)memset(inbuf, 0, MAX_KEYSIZE); |
ret = copyin(ci->ci_key, inbuf, keybytes); |
ret = copyin(ci->ci_key, inbuf, keybytes); |
if (ret) |
if (ret) |
goto bail; |
goto bail; |
|
|
cs->sc_cdata.cf_blocksize = ci->ci_blocksize; |
cs->sc_cdata.cf_blocksize = ci->ci_blocksize; |
cs->sc_cdata.cf_mode = CGD_CIPHER_CBC_ENCBLKNO; |
cs->sc_cdata.cf_mode = encblkno[i].v; |
cs->sc_cdata.cf_priv = cs->sc_cfuncs->cf_init(ci->ci_keylen, inbuf, |
cs->sc_cdata.cf_priv = cs->sc_cfuncs->cf_init(ci->ci_keylen, inbuf, |
&cs->sc_cdata.cf_blocksize); |
&cs->sc_cdata.cf_blocksize); |
|
/* |
|
* The blocksize is supposed to be in bytes. Unfortunately originally |
|
* it was expressed in bits. For compatibility we maintain encblkno |
|
* and encblkno8. |
|
*/ |
|
cs->sc_cdata.cf_blocksize /= encblkno[i].d; |
(void)memset(inbuf, 0, MAX_KEYSIZE); |
(void)memset(inbuf, 0, MAX_KEYSIZE); |
if (!cs->sc_cdata.cf_priv) { |
if (!cs->sc_cdata.cf_priv) { |
printf("cgd: unable to initialize cipher\n"); |
printf("cgd: unable to initialize cipher\n"); |