DF-3561 / fix.diff
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 | --- 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 = { |