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

Configure Feed

Select the types of activity you want to include in your feed.

crypto: dh - remove struct dh's ->q member

The only current user of the DH KPP algorithm, the
keyctl(KEYCTL_DH_COMPUTE) syscall, doesn't set the domain parameter ->q
in struct dh. Remove it and any associated (de)serialization code in
crypto_dh_encode_key() and crypto_dh_decode_key. Adjust the encoded
->secret values in testmgr's DH test vectors accordingly.

Note that the dh-generic implementation would have initialized its
struct dh_ctx's ->q from the decoded struct dh's ->q, if present. If this
struct dh_ctx's ->q would ever have been non-NULL, it would have enabled a
full key validation as specified in NIST SP800-56A in dh_is_pubkey_valid().
However, as outlined above, ->q is always NULL in practice and the full key
validation code is effectively dead. A later patch will make
dh_is_pubkey_valid() to calculate Q from P on the fly, if possible, so
don't remove struct dh_ctx's ->q now, but leave it there until that has
happened.

Signed-off-by: Nicolai Stange <nstange@suse.de>
Reviewed-by: Hannes Reinecke <hare@suse.de>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>

authored by

Nicolai Stange and committed by
Herbert Xu
48c6d8b8 46ed5269

+10 -33
-6
crypto/dh.c
··· 62 62 if (!ctx->p) 63 63 return -EINVAL; 64 64 65 - if (params->q && params->q_size) { 66 - ctx->q = mpi_read_raw_data(params->q, params->q_size); 67 - if (!ctx->q) 68 - return -EINVAL; 69 - } 70 - 71 65 ctx->g = mpi_read_raw_data(params->g, params->g_size); 72 66 if (!ctx->g) 73 67 return -EINVAL;
+4 -13
crypto/dh_helper.c
··· 10 10 #include <crypto/dh.h> 11 11 #include <crypto/kpp.h> 12 12 13 - #define DH_KPP_SECRET_MIN_SIZE (sizeof(struct kpp_secret) + 4 * sizeof(int)) 13 + #define DH_KPP_SECRET_MIN_SIZE (sizeof(struct kpp_secret) + 3 * sizeof(int)) 14 14 15 15 static inline u8 *dh_pack_data(u8 *dst, u8 *end, const void *src, size_t size) 16 16 { ··· 28 28 29 29 static inline unsigned int dh_data_size(const struct dh *p) 30 30 { 31 - return p->key_size + p->p_size + p->q_size + p->g_size; 31 + return p->key_size + p->p_size + p->g_size; 32 32 } 33 33 34 34 unsigned int crypto_dh_key_len(const struct dh *p) ··· 53 53 ptr = dh_pack_data(ptr, end, &params->key_size, 54 54 sizeof(params->key_size)); 55 55 ptr = dh_pack_data(ptr, end, &params->p_size, sizeof(params->p_size)); 56 - ptr = dh_pack_data(ptr, end, &params->q_size, sizeof(params->q_size)); 57 56 ptr = dh_pack_data(ptr, end, &params->g_size, sizeof(params->g_size)); 58 57 ptr = dh_pack_data(ptr, end, params->key, params->key_size); 59 58 ptr = dh_pack_data(ptr, end, params->p, params->p_size); 60 - ptr = dh_pack_data(ptr, end, params->q, params->q_size); 61 59 ptr = dh_pack_data(ptr, end, params->g, params->g_size); 62 60 if (ptr != end) 63 61 return -EINVAL; ··· 77 79 78 80 ptr = dh_unpack_data(&params->key_size, ptr, sizeof(params->key_size)); 79 81 ptr = dh_unpack_data(&params->p_size, ptr, sizeof(params->p_size)); 80 - ptr = dh_unpack_data(&params->q_size, ptr, sizeof(params->q_size)); 81 82 ptr = dh_unpack_data(&params->g_size, ptr, sizeof(params->g_size)); 82 83 if (secret.len != crypto_dh_key_len(params)) 83 84 return -EINVAL; ··· 86 89 * some drivers assume otherwise. 87 90 */ 88 91 if (params->key_size > params->p_size || 89 - params->g_size > params->p_size || params->q_size > params->p_size) 92 + params->g_size > params->p_size) 90 93 return -EINVAL; 91 94 92 95 /* Don't allocate memory. Set pointers to data within ··· 94 97 */ 95 98 params->key = (void *)ptr; 96 99 params->p = (void *)(ptr + params->key_size); 97 - params->q = (void *)(ptr + params->key_size + params->p_size); 98 - params->g = (void *)(ptr + params->key_size + params->p_size + 99 - params->q_size); 100 + params->g = (void *)(ptr + params->key_size + params->p_size); 100 101 101 102 /* 102 103 * Don't permit 'p' to be 0. It's not a prime number, and it's subject ··· 103 108 */ 104 109 if (memchr_inv(params->p, 0, params->p_size) == NULL) 105 110 return -EINVAL; 106 - 107 - /* It is permissible to not provide Q. */ 108 - if (params->q_size == 0) 109 - params->q = NULL; 110 111 111 112 return 0; 112 113 }
+6 -10
crypto/testmgr.h
··· 1246 1246 .secret = 1247 1247 #ifdef __LITTLE_ENDIAN 1248 1248 "\x01\x00" /* type */ 1249 - "\x15\x02" /* len */ 1249 + "\x11\x02" /* len */ 1250 1250 "\x00\x01\x00\x00" /* key_size */ 1251 1251 "\x00\x01\x00\x00" /* p_size */ 1252 - "\x00\x00\x00\x00" /* q_size */ 1253 1252 "\x01\x00\x00\x00" /* g_size */ 1254 1253 #else 1255 1254 "\x00\x01" /* type */ 1256 - "\x02\x15" /* len */ 1255 + "\x02\x11" /* len */ 1257 1256 "\x00\x00\x01\x00" /* key_size */ 1258 1257 "\x00\x00\x01\x00" /* p_size */ 1259 - "\x00\x00\x00\x00" /* q_size */ 1260 1258 "\x00\x00\x00\x01" /* g_size */ 1261 1259 #endif 1262 1260 /* xa */ ··· 1344 1346 "\xd3\x34\x49\xad\x64\xa6\xb1\xc0\x59\x28\x75\x60\xa7\x8a\xb0\x11" 1345 1347 "\x56\x89\x42\x74\x11\xf5\xf6\x5e\x6f\x16\x54\x6a\xb1\x76\x4d\x50" 1346 1348 "\x8a\x68\xc1\x5b\x82\xb9\x0d\x00\x32\x50\xed\x88\x87\x48\x92\x17", 1347 - .secret_size = 533, 1349 + .secret_size = 529, 1348 1350 .b_public_size = 256, 1349 1351 .expected_a_public_size = 256, 1350 1352 .expected_ss_size = 256, ··· 1353 1355 .secret = 1354 1356 #ifdef __LITTLE_ENDIAN 1355 1357 "\x01\x00" /* type */ 1356 - "\x15\x02" /* len */ 1358 + "\x11\x02" /* len */ 1357 1359 "\x00\x01\x00\x00" /* key_size */ 1358 1360 "\x00\x01\x00\x00" /* p_size */ 1359 - "\x00\x00\x00\x00" /* q_size */ 1360 1361 "\x01\x00\x00\x00" /* g_size */ 1361 1362 #else 1362 1363 "\x00\x01" /* type */ 1363 - "\x02\x15" /* len */ 1364 + "\x02\x11" /* len */ 1364 1365 "\x00\x00\x01\x00" /* key_size */ 1365 1366 "\x00\x00\x01\x00" /* p_size */ 1366 - "\x00\x00\x00\x00" /* q_size */ 1367 1367 "\x00\x00\x00\x01" /* g_size */ 1368 1368 #endif 1369 1369 /* xa */ ··· 1451 1455 "\x5e\x5a\x64\xbd\xf6\x85\x04\xe8\x28\x6a\xac\xef\xce\x19\x8e\x9a" 1452 1456 "\xfe\x75\xc0\x27\x69\xe3\xb3\x7b\x21\xa7\xb1\x16\xa4\x85\x23\xee" 1453 1457 "\xb0\x1b\x04\x6e\xbd\xab\x16\xde\xfd\x86\x6b\xa9\x95\xd7\x0b\xfd", 1454 - .secret_size = 533, 1458 + .secret_size = 529, 1455 1459 .b_public_size = 256, 1456 1460 .expected_a_public_size = 256, 1457 1461 .expected_ss_size = 256,
-4
include/crypto/dh.h
··· 24 24 * 25 25 * @key: Private DH key 26 26 * @p: Diffie-Hellman parameter P 27 - * @q: Diffie-Hellman parameter Q 28 27 * @g: Diffie-Hellman generator G 29 28 * @key_size: Size of the private DH key 30 29 * @p_size: Size of DH parameter P 31 - * @q_size: Size of DH parameter Q 32 30 * @g_size: Size of DH generator G 33 31 */ 34 32 struct dh { 35 33 void *key; 36 34 void *p; 37 - void *q; 38 35 void *g; 39 36 unsigned int key_size; 40 37 unsigned int p_size; 41 - unsigned int q_size; 42 38 unsigned int g_size; 43 39 }; 44 40