]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
crypto: sig - Fix verify call
authorHerbert Xu <herbert@gondor.apana.org.au>
Mon, 26 Jun 2023 10:33:44 +0000 (18:33 +0800)
committerHerbert Xu <herbert@gondor.apana.org.au>
Tue, 27 Jun 2023 07:40:24 +0000 (15:40 +0800)
The dst SG list needs to be set to NULL for verify calls.  Do
this as otherwise the underlying algorithm may fail.

Furthermore the digest needs to be copied just like the source.

Fixes: 6cb8815f41a9 ("crypto: sig - Add interface for sign/verify")
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
crypto/akcipher.c
crypto/internal.h
crypto/sig.c

index 8ffd31c44cf6c15777704c1385493c41d412e4f0..e9b6ddcdf1244a9d308961fa1ae1c6650c587267 100644 (file)
@@ -192,12 +192,17 @@ EXPORT_SYMBOL_GPL(akcipher_register_instance);
 int crypto_akcipher_sync_prep(struct crypto_akcipher_sync_data *data)
 {
        unsigned int reqsize = crypto_akcipher_reqsize(data->tfm);
-       unsigned int mlen = max(data->slen, data->dlen);
        struct akcipher_request *req;
        struct scatterlist *sg;
+       unsigned int mlen;
        unsigned int len;
        u8 *buf;
 
+       if (data->dst)
+               mlen = max(data->slen, data->dlen);
+       else
+               mlen = data->slen + data->dlen;
+
        len = sizeof(*req) + reqsize + mlen;
        if (len < mlen)
                return -EOVERFLOW;
@@ -213,9 +218,10 @@ int crypto_akcipher_sync_prep(struct crypto_akcipher_sync_data *data)
        data->buf = buf;
        memcpy(buf, data->src, data->slen);
 
-       sg = data->sg;
+       sg = &data->sg;
        sg_init_one(sg, buf, mlen);
-       akcipher_request_set_crypt(req, sg, sg, data->slen, data->dlen);
+       akcipher_request_set_crypt(req, sg, data->dst ? sg : NULL,
+                                  data->slen, data->dlen);
 
        crypto_init_wait(&data->cwait);
        akcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_SLEEP,
index e3cf5a658d51cff33666a4053d41f107e7bdeebf..63e59240d5fbf4fb17d7ce1bd87009a0519c8643 100644 (file)
@@ -44,7 +44,7 @@ struct crypto_akcipher_sync_data {
 
        struct akcipher_request *req;
        struct crypto_wait cwait;
-       struct scatterlist sg[2];
+       struct scatterlist sg;
        u8 *buf;
 };
 
index d812555c88af797073dcf6d06c6dc38c34463e44..b48c18ec65cd4ec5c63e39db7f7d75f4b681babf 100644 (file)
@@ -128,9 +128,7 @@ int crypto_sig_verify(struct crypto_sig *tfm,
        if (err)
                return err;
 
-       sg_init_table(data.sg, 2);
-       sg_set_buf(&data.sg[0], src, slen);
-       sg_set_buf(&data.sg[1], digest, dlen);
+       memcpy(data.buf + slen, digest, dlen);
 
        return crypto_akcipher_sync_post(&data,
                                         crypto_akcipher_verify(data.req));