.. | .. |
---|
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: |
---|