diff options
author | pjd <pjd@FreeBSD.org> | 2010-08-28 08:30:20 +0000 |
---|---|---|
committer | pjd <pjd@FreeBSD.org> | 2010-08-28 08:30:20 +0000 |
commit | f3ed6934bef86f684e6fe249ef4c5294f20e3d49 (patch) | |
tree | a2269890d78a7f9a529bd61ab9d6d561c0529063 /sys/geom/eli | |
parent | ed8ee3fb0868a560c107bf6eef5bc4d3295b86b9 (diff) | |
download | FreeBSD-src-f3ed6934bef86f684e6fe249ef4c5294f20e3d49.zip FreeBSD-src-f3ed6934bef86f684e6fe249ef4c5294f20e3d49.tar.gz |
Correct offset conversion to little endian. It was implemented in version 2,
but because of a bug it was a no-op, so we were still using offsets in native
byte order for the host. Do it properly this time, bump version to 4 and set
the G_ELI_FLAG_NATIVE_BYTE_ORDER flag when version is under 4.
MFC after: 2 weeks
Diffstat (limited to 'sys/geom/eli')
-rw-r--r-- | sys/geom/eli/g_eli.c | 8 | ||||
-rw-r--r-- | sys/geom/eli/g_eli.h | 8 |
2 files changed, 9 insertions, 7 deletions
diff --git a/sys/geom/eli/g_eli.c b/sys/geom/eli/g_eli.c index a3746c0..eb10b17 100644 --- a/sys/geom/eli/g_eli.c +++ b/sys/geom/eli/g_eli.c @@ -384,11 +384,13 @@ g_eli_crypto_ivgen(struct g_eli_softc *sc, off_t offset, u_char *iv, u_char off[8], hash[SHA256_DIGEST_LENGTH]; SHA256_CTX ctx; - if (!(sc->sc_flags & G_ELI_FLAG_NATIVE_BYTE_ORDER)) + if ((sc->sc_flags & G_ELI_FLAG_NATIVE_BYTE_ORDER) != 0) + bcopy(&offset, off, sizeof(off)); + else le64enc(off, (uint64_t)offset); /* Copy precalculated SHA256 context for IV-Key. */ bcopy(&sc->sc_ivctx, &ctx, sizeof(ctx)); - SHA256_Update(&ctx, (uint8_t *)&offset, sizeof(offset)); + SHA256_Update(&ctx, off, sizeof(off)); SHA256_Final(hash, &ctx); bcopy(hash, iv, size); } @@ -544,7 +546,7 @@ g_eli_create(struct gctl_req *req, struct g_class *mp, struct g_provider *bpp, sc->sc_crypto = G_ELI_CRYPTO_SW; sc->sc_flags = md->md_flags; /* Backward compatibility. */ - if (md->md_version < 2) + if (md->md_version < 4) sc->sc_flags |= G_ELI_FLAG_NATIVE_BYTE_ORDER; sc->sc_ealgo = md->md_ealgo; sc->sc_nkey = nkey; diff --git a/sys/geom/eli/g_eli.h b/sys/geom/eli/g_eli.h index 8079c9d..8f9c5ca 100644 --- a/sys/geom/eli/g_eli.h +++ b/sys/geom/eli/g_eli.h @@ -57,11 +57,11 @@ * 1 - Added data authentication support (md_aalgo field and * G_ELI_FLAG_AUTH flag). * 2 - Added G_ELI_FLAG_READONLY. - * - IV is generated from offset converted to little-endian - * (flag G_ELI_FLAG_NATIVE_BYTE_ORDER will be set for older versions). * 3 - Added 'configure' subcommand. + * 4 - IV is generated from offset converted to little-endian + * (flag G_ELI_FLAG_NATIVE_BYTE_ORDER will be set for older versions). */ -#define G_ELI_VERSION 3 +#define G_ELI_VERSION 4 /* ON DISK FLAGS. */ /* Use random, onetime keys. */ @@ -394,7 +394,7 @@ g_eli_keylen(u_int algo, u_int keylen) keylen = 0; } return (keylen); - case CRYPTO_AES_CBC: /* FALLTHROUGH */ + case CRYPTO_AES_CBC: case CRYPTO_CAMELLIA_CBC: switch (keylen) { case 0: |