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
This commit is contained in:
parent
915af965a2
commit
efb46508ce
@ -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;
|
||||
|
@ -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:
|
||||
|
Loading…
x
Reference in New Issue
Block a user