]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - net/sunrpc/auth_gss/gss_krb5_mech.c
Merge remote-tracking branch 'block/for-next'
[karo-tx-linux.git] / net / sunrpc / auth_gss / gss_krb5_mech.c
index 28db442a0034ad601d1a4cc2f2f82dc16a32a3da..71341ccb989043acd4c6d449a6d89d9db8b98513 100644 (file)
@@ -34,6 +34,8 @@
  *
  */
 
+#include <crypto/hash.h>
+#include <crypto/skcipher.h>
 #include <linux/err.h>
 #include <linux/module.h>
 #include <linux/init.h>
@@ -42,7 +44,6 @@
 #include <linux/sunrpc/auth.h>
 #include <linux/sunrpc/gss_krb5.h>
 #include <linux/sunrpc/xdr.h>
-#include <linux/crypto.h>
 #include <linux/sunrpc/gss_krb5_enctypes.h>
 
 #if IS_ENABLED(CONFIG_SUNRPC_DEBUG)
@@ -217,7 +218,7 @@ simple_get_netobj(const void *p, const void *end, struct xdr_netobj *res)
 
 static inline const void *
 get_key(const void *p, const void *end,
-       struct krb5_ctx *ctx, struct crypto_blkcipher **res)
+       struct krb5_ctx *ctx, struct crypto_skcipher **res)
 {
        struct xdr_netobj       key;
        int                     alg;
@@ -245,7 +246,7 @@ get_key(const void *p, const void *end,
        if (IS_ERR(p))
                goto out_err;
 
-       *res = crypto_alloc_blkcipher(ctx->gk5e->encrypt_name, 0,
+       *res = crypto_alloc_skcipher(ctx->gk5e->encrypt_name, 0,
                                                        CRYPTO_ALG_ASYNC);
        if (IS_ERR(*res)) {
                printk(KERN_WARNING "gss_kerberos_mech: unable to initialize "
@@ -253,7 +254,7 @@ get_key(const void *p, const void *end,
                *res = NULL;
                goto out_err_free_key;
        }
-       if (crypto_blkcipher_setkey(*res, key.data, key.len)) {
+       if (crypto_skcipher_setkey(*res, key.data, key.len)) {
                printk(KERN_WARNING "gss_kerberos_mech: error setting key for "
                        "crypto algorithm %s\n", ctx->gk5e->encrypt_name);
                goto out_err_free_tfm;
@@ -263,7 +264,7 @@ get_key(const void *p, const void *end,
        return p;
 
 out_err_free_tfm:
-       crypto_free_blkcipher(*res);
+       crypto_free_skcipher(*res);
 out_err_free_key:
        kfree(key.data);
        p = ERR_PTR(-EINVAL);
@@ -335,30 +336,30 @@ gss_import_v1_context(const void *p, const void *end, struct krb5_ctx *ctx)
        return 0;
 
 out_err_free_key2:
-       crypto_free_blkcipher(ctx->seq);
+       crypto_free_skcipher(ctx->seq);
 out_err_free_key1:
-       crypto_free_blkcipher(ctx->enc);
+       crypto_free_skcipher(ctx->enc);
 out_err_free_mech:
        kfree(ctx->mech_used.data);
 out_err:
        return PTR_ERR(p);
 }
 
-static struct crypto_blkcipher *
+static struct crypto_skcipher *
 context_v2_alloc_cipher(struct krb5_ctx *ctx, const char *cname, u8 *key)
 {
-       struct crypto_blkcipher *cp;
+       struct crypto_skcipher *cp;
 
-       cp = crypto_alloc_blkcipher(cname, 0, CRYPTO_ALG_ASYNC);
+       cp = crypto_alloc_skcipher(cname, 0, CRYPTO_ALG_ASYNC);
        if (IS_ERR(cp)) {
                dprintk("gss_kerberos_mech: unable to initialize "
                        "crypto algorithm %s\n", cname);
                return NULL;
        }
-       if (crypto_blkcipher_setkey(cp, key, ctx->gk5e->keylength)) {
+       if (crypto_skcipher_setkey(cp, key, ctx->gk5e->keylength)) {
                dprintk("gss_kerberos_mech: error setting key for "
                        "crypto algorithm %s\n", cname);
-               crypto_free_blkcipher(cp);
+               crypto_free_skcipher(cp);
                return NULL;
        }
        return cp;
@@ -412,9 +413,9 @@ context_derive_keys_des3(struct krb5_ctx *ctx, gfp_t gfp_mask)
        return 0;
 
 out_free_enc:
-       crypto_free_blkcipher(ctx->enc);
+       crypto_free_skcipher(ctx->enc);
 out_free_seq:
-       crypto_free_blkcipher(ctx->seq);
+       crypto_free_skcipher(ctx->seq);
 out_err:
        return -EINVAL;
 }
@@ -427,18 +428,17 @@ out_err:
 static int
 context_derive_keys_rc4(struct krb5_ctx *ctx)
 {
-       struct crypto_hash *hmac;
+       struct crypto_shash *hmac;
        char sigkeyconstant[] = "signaturekey";
        int slen = strlen(sigkeyconstant) + 1;  /* include null terminator */
-       struct hash_desc desc;
-       struct scatterlist sg[1];
+       struct shash_desc *desc;
        int err;
 
        dprintk("RPC:       %s: entered\n", __func__);
        /*
         * derive cksum (aka Ksign) key
         */
-       hmac = crypto_alloc_hash(ctx->gk5e->cksum_name, 0, CRYPTO_ALG_ASYNC);
+       hmac = crypto_alloc_shash(ctx->gk5e->cksum_name, 0, 0);
        if (IS_ERR(hmac)) {
                dprintk("%s: error %ld allocating hash '%s'\n",
                        __func__, PTR_ERR(hmac), ctx->gk5e->cksum_name);
@@ -446,37 +446,40 @@ context_derive_keys_rc4(struct krb5_ctx *ctx)
                goto out_err;
        }
 
-       err = crypto_hash_setkey(hmac, ctx->Ksess, ctx->gk5e->keylength);
+       err = crypto_shash_setkey(hmac, ctx->Ksess, ctx->gk5e->keylength);
        if (err)
                goto out_err_free_hmac;
 
-       sg_init_table(sg, 1);
-       sg_set_buf(sg, sigkeyconstant, slen);
 
-       desc.tfm = hmac;
-       desc.flags = 0;
-
-       err = crypto_hash_init(&desc);
-       if (err)
+       desc = kmalloc(sizeof(*desc), GFP_KERNEL);
+       if (!desc) {
+               dprintk("%s: failed to allocate hash descriptor for '%s'\n",
+                       __func__, ctx->gk5e->cksum_name);
+               err = -ENOMEM;
                goto out_err_free_hmac;
+       }
+
+       desc->tfm = hmac;
+       desc->flags = 0;
 
-       err = crypto_hash_digest(&desc, sg, slen, ctx->cksum);
+       err = crypto_shash_digest(desc, sigkeyconstant, slen, ctx->cksum);
+       kzfree(desc);
        if (err)
                goto out_err_free_hmac;
        /*
-        * allocate hash, and blkciphers for data and seqnum encryption
+        * allocate hash, and skciphers for data and seqnum encryption
         */
-       ctx->enc = crypto_alloc_blkcipher(ctx->gk5e->encrypt_name, 0,
-                                         CRYPTO_ALG_ASYNC);
+       ctx->enc = crypto_alloc_skcipher(ctx->gk5e->encrypt_name, 0,
+                                        CRYPTO_ALG_ASYNC);
        if (IS_ERR(ctx->enc)) {
                err = PTR_ERR(ctx->enc);
                goto out_err_free_hmac;
        }
 
-       ctx->seq = crypto_alloc_blkcipher(ctx->gk5e->encrypt_name, 0,
-                                         CRYPTO_ALG_ASYNC);
+       ctx->seq = crypto_alloc_skcipher(ctx->gk5e->encrypt_name, 0,
+                                        CRYPTO_ALG_ASYNC);
        if (IS_ERR(ctx->seq)) {
-               crypto_free_blkcipher(ctx->enc);
+               crypto_free_skcipher(ctx->enc);
                err = PTR_ERR(ctx->seq);
                goto out_err_free_hmac;
        }
@@ -486,7 +489,7 @@ context_derive_keys_rc4(struct krb5_ctx *ctx)
        err = 0;
 
 out_err_free_hmac:
-       crypto_free_hash(hmac);
+       crypto_free_shash(hmac);
 out_err:
        dprintk("RPC:       %s: returning %d\n", __func__, err);
        return err;
@@ -588,7 +591,7 @@ context_derive_keys_new(struct krb5_ctx *ctx, gfp_t gfp_mask)
                        context_v2_alloc_cipher(ctx, "cbc(aes)",
                                                ctx->acceptor_seal);
                if (ctx->acceptor_enc_aux == NULL) {
-                       crypto_free_blkcipher(ctx->initiator_enc_aux);
+                       crypto_free_skcipher(ctx->initiator_enc_aux);
                        goto out_free_acceptor_enc;
                }
        }
@@ -596,9 +599,9 @@ context_derive_keys_new(struct krb5_ctx *ctx, gfp_t gfp_mask)
        return 0;
 
 out_free_acceptor_enc:
-       crypto_free_blkcipher(ctx->acceptor_enc);
+       crypto_free_skcipher(ctx->acceptor_enc);
 out_free_initiator_enc:
-       crypto_free_blkcipher(ctx->initiator_enc);
+       crypto_free_skcipher(ctx->initiator_enc);
 out_err:
        return -EINVAL;
 }
@@ -710,12 +713,12 @@ static void
 gss_delete_sec_context_kerberos(void *internal_ctx) {
        struct krb5_ctx *kctx = internal_ctx;
 
-       crypto_free_blkcipher(kctx->seq);
-       crypto_free_blkcipher(kctx->enc);
-       crypto_free_blkcipher(kctx->acceptor_enc);
-       crypto_free_blkcipher(kctx->initiator_enc);
-       crypto_free_blkcipher(kctx->acceptor_enc_aux);
-       crypto_free_blkcipher(kctx->initiator_enc_aux);
+       crypto_free_skcipher(kctx->seq);
+       crypto_free_skcipher(kctx->enc);
+       crypto_free_skcipher(kctx->acceptor_enc);
+       crypto_free_skcipher(kctx->initiator_enc);
+       crypto_free_skcipher(kctx->acceptor_enc_aux);
+       crypto_free_skcipher(kctx->initiator_enc_aux);
        kfree(kctx->mech_used.data);
        kfree(kctx);
 }