| .. | .. |
|---|
| 316 | 316 | struct crypto_wait cwait; |
|---|
| 317 | 317 | struct crypto_akcipher *tfm; |
|---|
| 318 | 318 | struct akcipher_request *req; |
|---|
| 319 | | - struct scatterlist src_sg[2]; |
|---|
| 319 | + struct scatterlist src_sg; |
|---|
| 320 | 320 | char alg_name[CRYPTO_MAX_ALG_NAME]; |
|---|
| 321 | | - char *key, *ptr; |
|---|
| 321 | + char *buf, *ptr; |
|---|
| 322 | + size_t buf_len; |
|---|
| 322 | 323 | int ret; |
|---|
| 323 | 324 | |
|---|
| 324 | 325 | pr_devel("==>%s()\n", __func__); |
|---|
| .. | .. |
|---|
| 342 | 343 | if (!req) |
|---|
| 343 | 344 | goto error_free_tfm; |
|---|
| 344 | 345 | |
|---|
| 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) |
|---|
| 348 | 351 | goto error_free_req; |
|---|
| 349 | 352 | |
|---|
| 350 | | - memcpy(key, pkey->key, pkey->keylen); |
|---|
| 351 | | - ptr = key + pkey->keylen; |
|---|
| 353 | + memcpy(buf, pkey->key, pkey->keylen); |
|---|
| 354 | + ptr = buf + pkey->keylen; |
|---|
| 352 | 355 | ptr = pkey_pack_u32(ptr, pkey->algo); |
|---|
| 353 | 356 | ptr = pkey_pack_u32(ptr, pkey->paramlen); |
|---|
| 354 | 357 | memcpy(ptr, pkey->params, pkey->paramlen); |
|---|
| 355 | 358 | |
|---|
| 356 | 359 | 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); |
|---|
| 358 | 361 | else |
|---|
| 359 | | - ret = crypto_akcipher_set_pub_key(tfm, key, pkey->keylen); |
|---|
| 362 | + ret = crypto_akcipher_set_pub_key(tfm, buf, pkey->keylen); |
|---|
| 360 | 363 | if (ret) |
|---|
| 361 | | - goto error_free_key; |
|---|
| 364 | + goto error_free_buf; |
|---|
| 362 | 365 | |
|---|
| 363 | 366 | if (strcmp(pkey->pkey_algo, "sm2") == 0 && sig->data_size) { |
|---|
| 364 | 367 | ret = cert_sig_digest_update(sig, tfm); |
|---|
| 365 | 368 | if (ret) |
|---|
| 366 | | - goto error_free_key; |
|---|
| 369 | + goto error_free_buf; |
|---|
| 367 | 370 | } |
|---|
| 368 | 371 | |
|---|
| 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, |
|---|
| 373 | 377 | sig->digest_size); |
|---|
| 374 | 378 | crypto_init_wait(&cwait); |
|---|
| 375 | 379 | akcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG | |
|---|
| .. | .. |
|---|
| 377 | 381 | crypto_req_done, &cwait); |
|---|
| 378 | 382 | ret = crypto_wait_req(crypto_akcipher_verify(req), &cwait); |
|---|
| 379 | 383 | |
|---|
| 380 | | -error_free_key: |
|---|
| 381 | | - kfree(key); |
|---|
| 384 | +error_free_buf: |
|---|
| 385 | + kfree(buf); |
|---|
| 382 | 386 | error_free_req: |
|---|
| 383 | 387 | akcipher_request_free(req); |
|---|
| 384 | 388 | error_free_tfm: |
|---|