--- a/sys/crypto/cryptoapi/cryptoapi.c +++ b/sys/crypto/cryptoapi/cryptoapi.c @@ -370,7 +370,6 @@ struct aes_xts_ctx { rijndael_ctx key1; rijndael_ctx key2; - uint8_t tweak[AES_XTS_BLOCK_LEN]; }; static bool @@ -410,7 +409,8 @@ } static inline void -aes_xts_reinit(struct aes_xts_ctx *ctx, const uint8_t *iv) +aes_xts_reinit(struct aes_xts_ctx *ctx, uint8_t tweak[AES_XTS_BLOCK_LEN], + const uint8_t *iv) { #if 0 /* @@ -419,12 +419,12 @@ */ /* XXX: possibly use htole64? */ #endif - memcpy(ctx->tweak, iv, AES_XTS_IV_LEN); + memcpy(tweak, iv, AES_XTS_IV_LEN); /* Last 64 bits of IV are always zero */ - bzero(ctx->tweak + AES_XTS_IV_LEN, AES_XTS_IV_LEN); + bzero(tweak + AES_XTS_IV_LEN, AES_XTS_IV_LEN); - rijndael_encrypt(&ctx->key2, ctx->tweak, ctx->tweak); + rijndael_encrypt(&ctx->key2, tweak, tweak); } static void @@ -432,13 +432,16 @@ bool encrypt) { uint8_t block[AES_XTS_BLOCK_LEN]; + uint8_t tweak[AES_XTS_BLOCK_LEN]; struct aes_xts_ctx *ctx = _ctx; - aes_xts_reinit(ctx, iv); + aes_xts_reinit(ctx, tweak, iv); - crypt_data_xts(&ctx->key1, data, datalen, ctx->tweak, + crypt_data_xts(&ctx->key1, data, datalen, tweak, encrypt ? rijndael_encrypt_wrap : rijndael_decrypt_wrap, block, AES_XTS_BLOCK_LEN, AES_XTS_ALPHA); + + explicit_bzero(tweak, sizeof(tweak)); } const struct cryptoapi_cipher_spec cipher_aes_xts = { @@ -725,11 +728,11 @@ struct twofish_xts_ctx { twofish_ctx key1; twofish_ctx key2; - uint8_t tweak[TWOFISH_XTS_BLOCK_LEN]; }; static inline void -twofish_xts_reinit(struct twofish_xts_ctx *ctx, const uint8_t *iv) +twofish_xts_reinit(struct twofish_xts_ctx *ctx, + uint8_t tweak[TWOFISH_XTS_BLOCK_LEN], const uint8_t *iv) { #if 0 u_int64_t blocknum; @@ -742,12 +745,12 @@ */ /* XXX: possibly use htole64? */ #endif - memcpy(ctx->tweak, iv, TWOFISH_XTS_IV_LEN); + memcpy(tweak, iv, TWOFISH_XTS_IV_LEN); /* Last 64 bits of IV are always zero */ - bzero(ctx->tweak + TWOFISH_XTS_IV_LEN, TWOFISH_XTS_IV_LEN); + bzero(tweak + TWOFISH_XTS_IV_LEN, TWOFISH_XTS_IV_LEN); - twofish_encrypt(&ctx->key2, ctx->tweak, ctx->tweak); + twofish_encrypt(&ctx->key2, tweak, tweak); } static int @@ -782,13 +785,16 @@ bool encrypt) { uint8_t block[TWOFISH_XTS_BLOCK_LEN]; + uint8_t tweak[TWOFISH_XTS_BLOCK_LEN]; struct twofish_xts_ctx *ctx = _ctx; - twofish_xts_reinit(ctx, iv); + twofish_xts_reinit(ctx, tweak, iv); - crypt_data_xts(&ctx->key1, data, datalen, ctx->tweak, + crypt_data_xts(&ctx->key1, data, datalen, tweak, encrypt ? twofish_encrypt_wrap : twofish_decrypt_wrap, block, TWOFISH_XTS_BLOCK_LEN, AES_XTS_ALPHA); + + explicit_bzero(tweak, sizeof(tweak)); } const struct cryptoapi_cipher_spec cipher_twofish_xts = { @@ -888,11 +894,11 @@ struct serpent_xts_ctx { serpent_ctx key1; serpent_ctx key2; - uint8_t tweak[SERPENT_XTS_BLOCK_LEN]; }; static inline void -serpent_xts_reinit(struct serpent_xts_ctx *ctx, const uint8_t *iv) +serpent_xts_reinit(struct serpent_xts_ctx *ctx, + uint8_t tweak[SERPENT_XTS_BLOCK_LEN], const uint8_t *iv) { #if 0 u_int64_t blocknum; @@ -907,12 +913,12 @@ /* XXX: possibly use htole64? */ #endif - memcpy(ctx->tweak, iv, SERPENT_XTS_IV_LEN); + memcpy(tweak, iv, SERPENT_XTS_IV_LEN); /* Last 64 bits of IV are always zero */ - bzero(ctx->tweak + SERPENT_XTS_IV_LEN, SERPENT_XTS_IV_LEN); + bzero(tweak + SERPENT_XTS_IV_LEN, SERPENT_XTS_IV_LEN); - serpent_encrypt(&ctx->key2, ctx->tweak, ctx->tweak); + serpent_encrypt(&ctx->key2, tweak, tweak); } static int @@ -947,13 +953,16 @@ bool encrypt) { uint8_t block[SERPENT_XTS_BLOCK_LEN]; + uint8_t tweak[SERPENT_XTS_BLOCK_LEN]; struct serpent_xts_ctx *ctx = _ctx; - serpent_xts_reinit(ctx, iv); + serpent_xts_reinit(ctx, tweak, iv); - crypt_data_xts(&ctx->key1, data, datalen, ctx->tweak, + crypt_data_xts(&ctx->key1, data, datalen, tweak, encrypt ? serpent_encrypt_wrap : serpent_decrypt_wrap, block, SERPENT_XTS_BLOCK_LEN, AES_XTS_ALPHA); + + explicit_bzero(tweak, sizeof(tweak)); } const struct cryptoapi_cipher_spec cipher_serpent_xts = {