hc
2024-12-19 9370bb92b2d16684ee45cf24e879c93c509162da
kernel/crypto/asymmetric_keys/public_key.c
....@@ -316,9 +316,10 @@
316316 struct crypto_wait cwait;
317317 struct crypto_akcipher *tfm;
318318 struct akcipher_request *req;
319
- struct scatterlist src_sg[2];
319
+ struct scatterlist src_sg;
320320 char alg_name[CRYPTO_MAX_ALG_NAME];
321
- char *key, *ptr;
321
+ char *buf, *ptr;
322
+ size_t buf_len;
322323 int ret;
323324
324325 pr_devel("==>%s()\n", __func__);
....@@ -342,34 +343,37 @@
342343 if (!req)
343344 goto error_free_tfm;
344345
345
- key = kmalloc(pkey->keylen + sizeof(u32) * 2 + pkey->paramlen,
346
- GFP_KERNEL);
347
- if (!key)
346
+ buf_len = max_t(size_t, pkey->keylen + sizeof(u32) * 2 + pkey->paramlen,
347
+ sig->s_size + sig->digest_size);
348
+
349
+ buf = kmalloc(buf_len, GFP_KERNEL);
350
+ if (!buf)
348351 goto error_free_req;
349352
350
- memcpy(key, pkey->key, pkey->keylen);
351
- ptr = key + pkey->keylen;
353
+ memcpy(buf, pkey->key, pkey->keylen);
354
+ ptr = buf + pkey->keylen;
352355 ptr = pkey_pack_u32(ptr, pkey->algo);
353356 ptr = pkey_pack_u32(ptr, pkey->paramlen);
354357 memcpy(ptr, pkey->params, pkey->paramlen);
355358
356359 if (pkey->key_is_private)
357
- ret = crypto_akcipher_set_priv_key(tfm, key, pkey->keylen);
360
+ ret = crypto_akcipher_set_priv_key(tfm, buf, pkey->keylen);
358361 else
359
- ret = crypto_akcipher_set_pub_key(tfm, key, pkey->keylen);
362
+ ret = crypto_akcipher_set_pub_key(tfm, buf, pkey->keylen);
360363 if (ret)
361
- goto error_free_key;
364
+ goto error_free_buf;
362365
363366 if (strcmp(pkey->pkey_algo, "sm2") == 0 && sig->data_size) {
364367 ret = cert_sig_digest_update(sig, tfm);
365368 if (ret)
366
- goto error_free_key;
369
+ goto error_free_buf;
367370 }
368371
369
- sg_init_table(src_sg, 2);
370
- sg_set_buf(&src_sg[0], sig->s, sig->s_size);
371
- sg_set_buf(&src_sg[1], sig->digest, sig->digest_size);
372
- akcipher_request_set_crypt(req, src_sg, NULL, sig->s_size,
372
+ memcpy(buf, sig->s, sig->s_size);
373
+ memcpy(buf + sig->s_size, sig->digest, sig->digest_size);
374
+
375
+ sg_init_one(&src_sg, buf, sig->s_size + sig->digest_size);
376
+ akcipher_request_set_crypt(req, &src_sg, NULL, sig->s_size,
373377 sig->digest_size);
374378 crypto_init_wait(&cwait);
375379 akcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG |
....@@ -377,8 +381,8 @@
377381 crypto_req_done, &cwait);
378382 ret = crypto_wait_req(crypto_akcipher_verify(req), &cwait);
379383
380
-error_free_key:
381
- kfree(key);
384
+error_free_buf:
385
+ kfree(buf);
382386 error_free_req:
383387 akcipher_request_free(req);
384388 error_free_tfm: