sctp: Use shash
[cascardo/linux.git] / net / sctp / sm_make_chunk.c
index 5d6a03f..1296e55 100644 (file)
@@ -45,6 +45,7 @@
 
 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 
+#include <crypto/hash.h>
 #include <linux/types.h>
 #include <linux/kernel.h>
 #include <linux/ip.h>
@@ -52,7 +53,6 @@
 #include <linux/net.h>
 #include <linux/inet.h>
 #include <linux/scatterlist.h>
-#include <linux/crypto.h>
 #include <linux/slab.h>
 #include <net/sock.h>
 
@@ -1606,7 +1606,6 @@ static sctp_cookie_param_t *sctp_pack_cookie(const struct sctp_endpoint *ep,
 {
        sctp_cookie_param_t *retval;
        struct sctp_signed_cookie *cookie;
-       struct scatterlist sg;
        int headersize, bodysize;
 
        /* Header size is static data prior to the actual cookie, including
@@ -1663,16 +1662,19 @@ static sctp_cookie_param_t *sctp_pack_cookie(const struct sctp_endpoint *ep,
               ntohs(init_chunk->chunk_hdr->length), raw_addrs, addrs_len);
 
        if (sctp_sk(ep->base.sk)->hmac) {
-               struct hash_desc desc;
+               SHASH_DESC_ON_STACK(desc, sctp_sk(ep->base.sk)->hmac);
+               int err;
 
                /* Sign the message.  */
-               sg_init_one(&sg, &cookie->c, bodysize);
-               desc.tfm = sctp_sk(ep->base.sk)->hmac;
-               desc.flags = 0;
-
-               if (crypto_hash_setkey(desc.tfm, ep->secret_key,
-                                      sizeof(ep->secret_key)) ||
-                   crypto_hash_digest(&desc, &sg, bodysize, cookie->signature))
+               desc->tfm = sctp_sk(ep->base.sk)->hmac;
+               desc->flags = 0;
+
+               err = crypto_shash_setkey(desc->tfm, ep->secret_key,
+                                         sizeof(ep->secret_key)) ?:
+                     crypto_shash_digest(desc, (u8 *)&cookie->c, bodysize,
+                                         cookie->signature);
+               shash_desc_zero(desc);
+               if (err)
                        goto free_cookie;
        }
 
@@ -1697,12 +1699,10 @@ struct sctp_association *sctp_unpack_cookie(
        struct sctp_cookie *bear_cookie;
        int headersize, bodysize, fixed_size;
        __u8 *digest = ep->digest;
-       struct scatterlist sg;
        unsigned int len;
        sctp_scope_t scope;
        struct sk_buff *skb = chunk->skb;
        ktime_t kt;
-       struct hash_desc desc;
 
        /* Header size is static data prior to the actual cookie, including
         * any padding.
@@ -1733,16 +1733,23 @@ struct sctp_association *sctp_unpack_cookie(
                goto no_hmac;
 
        /* Check the signature.  */
-       sg_init_one(&sg, bear_cookie, bodysize);
-       desc.tfm = sctp_sk(ep->base.sk)->hmac;
-       desc.flags = 0;
-
-       memset(digest, 0x00, SCTP_SIGNATURE_SIZE);
-       if (crypto_hash_setkey(desc.tfm, ep->secret_key,
-                              sizeof(ep->secret_key)) ||
-           crypto_hash_digest(&desc, &sg, bodysize, digest)) {
-               *error = -SCTP_IERROR_NOMEM;
-               goto fail;
+       {
+               SHASH_DESC_ON_STACK(desc, sctp_sk(ep->base.sk)->hmac);
+               int err;
+
+               desc->tfm = sctp_sk(ep->base.sk)->hmac;
+               desc->flags = 0;
+
+               err = crypto_shash_setkey(desc->tfm, ep->secret_key,
+                                         sizeof(ep->secret_key)) ?:
+                     crypto_shash_digest(desc, (u8 *)bear_cookie, bodysize,
+                                         digest);
+               shash_desc_zero(desc);
+
+               if (err) {
+                       *error = -SCTP_IERROR_NOMEM;
+                       goto fail;
+               }
        }
 
        if (memcmp(digest, cookie->signature, SCTP_SIGNATURE_SIZE)) {