Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

crypto: hash - annotate algorithms taking optional key

We need to consistently enforce that keyed hashes cannot be used without
setting the key. To do this we need a reliable way to determine whether
a given hash algorithm is keyed or not. AF_ALG currently does this by
checking for the presence of a ->setkey() method. However, this is
actually slightly broken because the CRC-32 algorithms implement
->setkey() but can also be used without a key. (The CRC-32 "key" is not
actually a cryptographic key but rather represents the initial state.
If not overridden, then a default initial state is used.)

Prepare to fix this by introducing a flag CRYPTO_ALG_OPTIONAL_KEY which
indicates that the algorithm has a ->setkey() method, but it is not
required to be called. Then set it on all the CRC-32 algorithms.

The same also applies to the Adler-32 implementation in Lustre.

Also, the cryptd and mcryptd templates have to pass through the flag
from their underlying algorithm.

Cc: stable@vger.kernel.org
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>

authored by

Eric Biggers and committed by
Herbert Xu
a208fa8f a16e772e

+30 -9
+2
arch/arm/crypto/crc32-ce-glue.c
··· 188 188 .base.cra_name = "crc32", 189 189 .base.cra_driver_name = "crc32-arm-ce", 190 190 .base.cra_priority = 200, 191 + .base.cra_flags = CRYPTO_ALG_OPTIONAL_KEY, 191 192 .base.cra_blocksize = 1, 192 193 .base.cra_module = THIS_MODULE, 193 194 }, { ··· 204 203 .base.cra_name = "crc32c", 205 204 .base.cra_driver_name = "crc32c-arm-ce", 206 205 .base.cra_priority = 200, 206 + .base.cra_flags = CRYPTO_ALG_OPTIONAL_KEY, 207 207 .base.cra_blocksize = 1, 208 208 .base.cra_module = THIS_MODULE, 209 209 } };
+2
arch/arm64/crypto/crc32-ce-glue.c
··· 185 185 .base.cra_name = "crc32", 186 186 .base.cra_driver_name = "crc32-arm64-ce", 187 187 .base.cra_priority = 200, 188 + .base.cra_flags = CRYPTO_ALG_OPTIONAL_KEY, 188 189 .base.cra_blocksize = 1, 189 190 .base.cra_module = THIS_MODULE, 190 191 }, { ··· 201 200 .base.cra_name = "crc32c", 202 201 .base.cra_driver_name = "crc32c-arm64-ce", 203 202 .base.cra_priority = 200, 203 + .base.cra_flags = CRYPTO_ALG_OPTIONAL_KEY, 204 204 .base.cra_blocksize = 1, 205 205 .base.cra_module = THIS_MODULE, 206 206 } };
+1
arch/powerpc/crypto/crc32c-vpmsum_glue.c
··· 141 141 .cra_name = "crc32c", 142 142 .cra_driver_name = "crc32c-vpmsum", 143 143 .cra_priority = 200, 144 + .cra_flags = CRYPTO_ALG_OPTIONAL_KEY, 144 145 .cra_blocksize = CHKSUM_BLOCK_SIZE, 145 146 .cra_ctxsize = sizeof(u32), 146 147 .cra_module = THIS_MODULE,
+3
arch/s390/crypto/crc32-vx.c
··· 239 239 .cra_name = "crc32", 240 240 .cra_driver_name = "crc32-vx", 241 241 .cra_priority = 200, 242 + .cra_flags = CRYPTO_ALG_OPTIONAL_KEY, 242 243 .cra_blocksize = CRC32_BLOCK_SIZE, 243 244 .cra_ctxsize = sizeof(struct crc_ctx), 244 245 .cra_module = THIS_MODULE, ··· 260 259 .cra_name = "crc32be", 261 260 .cra_driver_name = "crc32be-vx", 262 261 .cra_priority = 200, 262 + .cra_flags = CRYPTO_ALG_OPTIONAL_KEY, 263 263 .cra_blocksize = CRC32_BLOCK_SIZE, 264 264 .cra_ctxsize = sizeof(struct crc_ctx), 265 265 .cra_module = THIS_MODULE, ··· 281 279 .cra_name = "crc32c", 282 280 .cra_driver_name = "crc32c-vx", 283 281 .cra_priority = 200, 282 + .cra_flags = CRYPTO_ALG_OPTIONAL_KEY, 284 283 .cra_blocksize = CRC32_BLOCK_SIZE, 285 284 .cra_ctxsize = sizeof(struct crc_ctx), 286 285 .cra_module = THIS_MODULE,
+1
arch/sparc/crypto/crc32c_glue.c
··· 133 133 .cra_name = "crc32c", 134 134 .cra_driver_name = "crc32c-sparc64", 135 135 .cra_priority = SPARC_CR_OPCODE_PRIORITY, 136 + .cra_flags = CRYPTO_ALG_OPTIONAL_KEY, 136 137 .cra_blocksize = CHKSUM_BLOCK_SIZE, 137 138 .cra_ctxsize = sizeof(u32), 138 139 .cra_alignmask = 7,
+1
arch/x86/crypto/crc32-pclmul_glue.c
··· 162 162 .cra_name = "crc32", 163 163 .cra_driver_name = "crc32-pclmul", 164 164 .cra_priority = 200, 165 + .cra_flags = CRYPTO_ALG_OPTIONAL_KEY, 165 166 .cra_blocksize = CHKSUM_BLOCK_SIZE, 166 167 .cra_ctxsize = sizeof(u32), 167 168 .cra_module = THIS_MODULE,
+1
arch/x86/crypto/crc32c-intel_glue.c
··· 226 226 .cra_name = "crc32c", 227 227 .cra_driver_name = "crc32c-intel", 228 228 .cra_priority = 200, 229 + .cra_flags = CRYPTO_ALG_OPTIONAL_KEY, 229 230 .cra_blocksize = CHKSUM_BLOCK_SIZE, 230 231 .cra_ctxsize = sizeof(u32), 231 232 .cra_module = THIS_MODULE,
+1
crypto/crc32_generic.c
··· 133 133 .cra_name = "crc32", 134 134 .cra_driver_name = "crc32-generic", 135 135 .cra_priority = 100, 136 + .cra_flags = CRYPTO_ALG_OPTIONAL_KEY, 136 137 .cra_blocksize = CHKSUM_BLOCK_SIZE, 137 138 .cra_ctxsize = sizeof(u32), 138 139 .cra_module = THIS_MODULE,
+1
crypto/crc32c_generic.c
··· 146 146 .cra_name = "crc32c", 147 147 .cra_driver_name = "crc32c-generic", 148 148 .cra_priority = 100, 149 + .cra_flags = CRYPTO_ALG_OPTIONAL_KEY, 149 150 .cra_blocksize = CHKSUM_BLOCK_SIZE, 150 151 .cra_alignmask = 3, 151 152 .cra_ctxsize = sizeof(struct chksum_ctx),
+3 -4
crypto/cryptd.c
··· 896 896 if (err) 897 897 goto out_free_inst; 898 898 899 - type = CRYPTO_ALG_ASYNC; 900 - if (alg->cra_flags & CRYPTO_ALG_INTERNAL) 901 - type |= CRYPTO_ALG_INTERNAL; 902 - inst->alg.halg.base.cra_flags = type; 899 + inst->alg.halg.base.cra_flags = CRYPTO_ALG_ASYNC | 900 + (alg->cra_flags & (CRYPTO_ALG_INTERNAL | 901 + CRYPTO_ALG_OPTIONAL_KEY)); 903 902 904 903 inst->alg.halg.digestsize = salg->digestsize; 905 904 inst->alg.halg.statesize = salg->statesize;
+3 -4
crypto/mcryptd.c
··· 516 516 if (err) 517 517 goto out_free_inst; 518 518 519 - type = CRYPTO_ALG_ASYNC; 520 - if (alg->cra_flags & CRYPTO_ALG_INTERNAL) 521 - type |= CRYPTO_ALG_INTERNAL; 522 - inst->alg.halg.base.cra_flags = type; 519 + inst->alg.halg.base.cra_flags = CRYPTO_ALG_ASYNC | 520 + (alg->cra_flags & (CRYPTO_ALG_INTERNAL | 521 + CRYPTO_ALG_OPTIONAL_KEY)); 523 522 524 523 inst->alg.halg.digestsize = halg->digestsize; 525 524 inst->alg.halg.statesize = halg->statesize;
+2 -1
drivers/crypto/bfin_crc.c
··· 494 494 .cra_driver_name = DRIVER_NAME, 495 495 .cra_priority = 100, 496 496 .cra_flags = CRYPTO_ALG_TYPE_AHASH | 497 - CRYPTO_ALG_ASYNC, 497 + CRYPTO_ALG_ASYNC | 498 + CRYPTO_ALG_OPTIONAL_KEY, 498 499 .cra_blocksize = CHKSUM_BLOCK_SIZE, 499 500 .cra_ctxsize = sizeof(struct bfin_crypto_crc_ctx), 500 501 .cra_alignmask = 3,
+2
drivers/crypto/stm32/stm32_crc32.c
··· 208 208 .cra_name = "crc32", 209 209 .cra_driver_name = DRIVER_NAME, 210 210 .cra_priority = 200, 211 + .cra_flags = CRYPTO_ALG_OPTIONAL_KEY, 211 212 .cra_blocksize = CHKSUM_BLOCK_SIZE, 212 213 .cra_alignmask = 3, 213 214 .cra_ctxsize = sizeof(struct stm32_crc_ctx), ··· 230 229 .cra_name = "crc32c", 231 230 .cra_driver_name = DRIVER_NAME, 232 231 .cra_priority = 200, 232 + .cra_flags = CRYPTO_ALG_OPTIONAL_KEY, 233 233 .cra_blocksize = CHKSUM_BLOCK_SIZE, 234 234 .cra_alignmask = 3, 235 235 .cra_ctxsize = sizeof(struct stm32_crc_ctx),
+1
drivers/staging/lustre/lnet/libcfs/linux/linux-crypto-adler.c
··· 120 120 .cra_name = "adler32", 121 121 .cra_driver_name = "adler32-zlib", 122 122 .cra_priority = 100, 123 + .cra_flags = CRYPTO_ALG_OPTIONAL_KEY, 123 124 .cra_blocksize = CHKSUM_BLOCK_SIZE, 124 125 .cra_ctxsize = sizeof(u32), 125 126 .cra_module = THIS_MODULE,
+6
include/linux/crypto.h
··· 107 107 #define CRYPTO_ALG_INTERNAL 0x00002000 108 108 109 109 /* 110 + * Set if the algorithm has a ->setkey() method but can be used without 111 + * calling it first, i.e. there is a default key. 112 + */ 113 + #define CRYPTO_ALG_OPTIONAL_KEY 0x00004000 114 + 115 + /* 110 116 * Transform masks and values (for crt_flags). 111 117 */ 112 118 #define CRYPTO_TFM_REQ_MASK 0x000fff00