|
@@ -166,8 +166,8 @@ make_checksum_hmac_md5(struct krb5_ctx *kctx, char *header, int hdrlen,
|
|
|
unsigned int usage, struct xdr_netobj *cksumout)
|
|
|
{
|
|
|
struct scatterlist sg[1];
|
|
|
- int err;
|
|
|
- u8 checksumdata[GSS_KRB5_MAX_CKSUM_LEN];
|
|
|
+ int err = -1;
|
|
|
+ u8 *checksumdata;
|
|
|
u8 rc4salt[4];
|
|
|
struct crypto_ahash *md5;
|
|
|
struct crypto_ahash *hmac_md5;
|
|
@@ -187,23 +187,22 @@ make_checksum_hmac_md5(struct krb5_ctx *kctx, char *header, int hdrlen,
|
|
|
return GSS_S_FAILURE;
|
|
|
}
|
|
|
|
|
|
+ checksumdata = kmalloc(GSS_KRB5_MAX_CKSUM_LEN, GFP_NOFS);
|
|
|
+ if (!checksumdata)
|
|
|
+ return GSS_S_FAILURE;
|
|
|
+
|
|
|
md5 = crypto_alloc_ahash("md5", 0, CRYPTO_ALG_ASYNC);
|
|
|
if (IS_ERR(md5))
|
|
|
- return GSS_S_FAILURE;
|
|
|
+ goto out_free_cksum;
|
|
|
|
|
|
hmac_md5 = crypto_alloc_ahash(kctx->gk5e->cksum_name, 0,
|
|
|
CRYPTO_ALG_ASYNC);
|
|
|
- if (IS_ERR(hmac_md5)) {
|
|
|
- crypto_free_ahash(md5);
|
|
|
- return GSS_S_FAILURE;
|
|
|
- }
|
|
|
+ if (IS_ERR(hmac_md5))
|
|
|
+ goto out_free_md5;
|
|
|
|
|
|
req = ahash_request_alloc(md5, GFP_KERNEL);
|
|
|
- if (!req) {
|
|
|
- crypto_free_ahash(hmac_md5);
|
|
|
- crypto_free_ahash(md5);
|
|
|
- return GSS_S_FAILURE;
|
|
|
- }
|
|
|
+ if (!req)
|
|
|
+ goto out_free_hmac_md5;
|
|
|
|
|
|
ahash_request_set_callback(req, CRYPTO_TFM_REQ_MAY_SLEEP, NULL, NULL);
|
|
|
|
|
@@ -232,11 +231,8 @@ make_checksum_hmac_md5(struct krb5_ctx *kctx, char *header, int hdrlen,
|
|
|
|
|
|
ahash_request_free(req);
|
|
|
req = ahash_request_alloc(hmac_md5, GFP_KERNEL);
|
|
|
- if (!req) {
|
|
|
- crypto_free_ahash(hmac_md5);
|
|
|
- crypto_free_ahash(md5);
|
|
|
- return GSS_S_FAILURE;
|
|
|
- }
|
|
|
+ if (!req)
|
|
|
+ goto out_free_hmac_md5;
|
|
|
|
|
|
ahash_request_set_callback(req, CRYPTO_TFM_REQ_MAY_SLEEP, NULL, NULL);
|
|
|
|
|
@@ -258,8 +254,12 @@ make_checksum_hmac_md5(struct krb5_ctx *kctx, char *header, int hdrlen,
|
|
|
cksumout->len = kctx->gk5e->cksumlength;
|
|
|
out:
|
|
|
ahash_request_free(req);
|
|
|
- crypto_free_ahash(md5);
|
|
|
+out_free_hmac_md5:
|
|
|
crypto_free_ahash(hmac_md5);
|
|
|
+out_free_md5:
|
|
|
+ crypto_free_ahash(md5);
|
|
|
+out_free_cksum:
|
|
|
+ kfree(checksumdata);
|
|
|
return err ? GSS_S_FAILURE : 0;
|
|
|
}
|
|
|
|
|
@@ -276,8 +276,8 @@ make_checksum(struct krb5_ctx *kctx, char *header, int hdrlen,
|
|
|
struct crypto_ahash *tfm;
|
|
|
struct ahash_request *req;
|
|
|
struct scatterlist sg[1];
|
|
|
- int err;
|
|
|
- u8 checksumdata[GSS_KRB5_MAX_CKSUM_LEN];
|
|
|
+ int err = -1;
|
|
|
+ u8 *checksumdata;
|
|
|
unsigned int checksumlen;
|
|
|
|
|
|
if (kctx->gk5e->ctype == CKSUMTYPE_HMAC_MD5_ARCFOUR)
|
|
@@ -291,15 +291,17 @@ make_checksum(struct krb5_ctx *kctx, char *header, int hdrlen,
|
|
|
return GSS_S_FAILURE;
|
|
|
}
|
|
|
|
|
|
+ checksumdata = kmalloc(GSS_KRB5_MAX_CKSUM_LEN, GFP_NOFS);
|
|
|
+ if (checksumdata == NULL)
|
|
|
+ return GSS_S_FAILURE;
|
|
|
+
|
|
|
tfm = crypto_alloc_ahash(kctx->gk5e->cksum_name, 0, CRYPTO_ALG_ASYNC);
|
|
|
if (IS_ERR(tfm))
|
|
|
- return GSS_S_FAILURE;
|
|
|
+ goto out_free_cksum;
|
|
|
|
|
|
req = ahash_request_alloc(tfm, GFP_KERNEL);
|
|
|
- if (!req) {
|
|
|
- crypto_free_ahash(tfm);
|
|
|
- return GSS_S_FAILURE;
|
|
|
- }
|
|
|
+ if (!req)
|
|
|
+ goto out_free_ahash;
|
|
|
|
|
|
ahash_request_set_callback(req, CRYPTO_TFM_REQ_MAY_SLEEP, NULL, NULL);
|
|
|
|
|
@@ -349,7 +351,10 @@ make_checksum(struct krb5_ctx *kctx, char *header, int hdrlen,
|
|
|
cksumout->len = kctx->gk5e->cksumlength;
|
|
|
out:
|
|
|
ahash_request_free(req);
|
|
|
+out_free_ahash:
|
|
|
crypto_free_ahash(tfm);
|
|
|
+out_free_cksum:
|
|
|
+ kfree(checksumdata);
|
|
|
return err ? GSS_S_FAILURE : 0;
|
|
|
}
|
|
|
|
|
@@ -368,8 +373,8 @@ make_checksum_v2(struct krb5_ctx *kctx, char *header, int hdrlen,
|
|
|
struct crypto_ahash *tfm;
|
|
|
struct ahash_request *req;
|
|
|
struct scatterlist sg[1];
|
|
|
- int err;
|
|
|
- u8 checksumdata[GSS_KRB5_MAX_CKSUM_LEN];
|
|
|
+ int err = -1;
|
|
|
+ u8 *checksumdata;
|
|
|
unsigned int checksumlen;
|
|
|
|
|
|
if (kctx->gk5e->keyed_cksum == 0) {
|
|
@@ -383,16 +388,18 @@ make_checksum_v2(struct krb5_ctx *kctx, char *header, int hdrlen,
|
|
|
return GSS_S_FAILURE;
|
|
|
}
|
|
|
|
|
|
+ checksumdata = kmalloc(GSS_KRB5_MAX_CKSUM_LEN, GFP_NOFS);
|
|
|
+ if (!checksumdata)
|
|
|
+ return GSS_S_FAILURE;
|
|
|
+
|
|
|
tfm = crypto_alloc_ahash(kctx->gk5e->cksum_name, 0, CRYPTO_ALG_ASYNC);
|
|
|
if (IS_ERR(tfm))
|
|
|
- return GSS_S_FAILURE;
|
|
|
+ goto out_free_cksum;
|
|
|
checksumlen = crypto_ahash_digestsize(tfm);
|
|
|
|
|
|
req = ahash_request_alloc(tfm, GFP_KERNEL);
|
|
|
- if (!req) {
|
|
|
- crypto_free_ahash(tfm);
|
|
|
- return GSS_S_FAILURE;
|
|
|
- }
|
|
|
+ if (!req)
|
|
|
+ goto out_free_ahash;
|
|
|
|
|
|
ahash_request_set_callback(req, CRYPTO_TFM_REQ_MAY_SLEEP, NULL, NULL);
|
|
|
|
|
@@ -433,7 +440,10 @@ make_checksum_v2(struct krb5_ctx *kctx, char *header, int hdrlen,
|
|
|
}
|
|
|
out:
|
|
|
ahash_request_free(req);
|
|
|
+out_free_ahash:
|
|
|
crypto_free_ahash(tfm);
|
|
|
+out_free_cksum:
|
|
|
+ kfree(checksumdata);
|
|
|
return err ? GSS_S_FAILURE : 0;
|
|
|
}
|
|
|
|
|
@@ -666,14 +676,17 @@ gss_krb5_cts_crypt(struct crypto_skcipher *cipher, struct xdr_buf *buf,
|
|
|
u32 ret;
|
|
|
struct scatterlist sg[1];
|
|
|
SKCIPHER_REQUEST_ON_STACK(req, cipher);
|
|
|
- u8 data[GSS_KRB5_MAX_BLOCKSIZE * 2];
|
|
|
+ u8 *data;
|
|
|
struct page **save_pages;
|
|
|
u32 len = buf->len - offset;
|
|
|
|
|
|
- if (len > ARRAY_SIZE(data)) {
|
|
|
+ if (len > GSS_KRB5_MAX_BLOCKSIZE * 2) {
|
|
|
WARN_ON(0);
|
|
|
return -ENOMEM;
|
|
|
}
|
|
|
+ data = kmalloc(GSS_KRB5_MAX_BLOCKSIZE * 2, GFP_NOFS);
|
|
|
+ if (!data)
|
|
|
+ return -ENOMEM;
|
|
|
|
|
|
/*
|
|
|
* For encryption, we want to read from the cleartext
|
|
@@ -708,6 +721,7 @@ gss_krb5_cts_crypt(struct crypto_skcipher *cipher, struct xdr_buf *buf,
|
|
|
ret = write_bytes_to_xdr_buf(buf, offset, data, len);
|
|
|
|
|
|
out:
|
|
|
+ kfree(data);
|
|
|
return ret;
|
|
|
}
|
|
|
|