-static inline const void *
-get_key(const void *p, const void *end, struct crypto_tfm **res, int *resalg)
-{
- struct xdr_netobj key = { 0 };
- int alg_mode,setkey = 0;
- char *alg_name;
-
- p = simple_get_bytes(p, end, resalg, sizeof(*resalg));
- if (IS_ERR(p))
- goto out_err;
- p = simple_get_netobj(p, end, &key);
- if (IS_ERR(p))
- goto out_err;
-
- switch (*resalg) {
- case NID_des_cbc:
- alg_name = "des";
- alg_mode = CRYPTO_TFM_MODE_CBC;
- setkey = 1;
- break;
- case NID_md5:
- if (key.len == 0) {
- dprintk("RPC: SPKM3 get_key: NID_md5 zero Key length\n");
- }
- alg_name = "md5";
- alg_mode = 0;
- setkey = 0;
- break;
- default:
- dprintk("RPC: SPKM3 get_key: unsupported algorithm %d", *resalg);
- goto out_err_free_key;
- }
- if (!(*res = crypto_alloc_tfm(alg_name, alg_mode)))
- goto out_err_free_key;
- if (setkey) {
- if (crypto_cipher_setkey(*res, key.data, key.len))
- goto out_err_free_tfm;
- }
-
- if(key.len > 0)
- kfree(key.data);
- return p;
-
-out_err_free_tfm:
- crypto_free_tfm(*res);
-out_err_free_key:
- if(key.len > 0)
- kfree(key.data);
- p = ERR_PTR(-EINVAL);
-out_err:
- return p;
-}
-