X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fptlrpc%2Fgss%2Fgss_crypto.c;h=5aebc48a2196105cffdbad5519a189364cd59291;hb=f843facff59226d3788d855d1d6948523ab8d944;hp=17fd9cf3c00c17473e53e1833571ac9d11f36a37;hpb=d10200a80770f0029d1d665af954187b9ad883df;p=fs%2Flustre-release.git diff --git a/lustre/ptlrpc/gss/gss_crypto.c b/lustre/ptlrpc/gss/gss_crypto.c index 17fd9cf..5aebc48 100644 --- a/lustre/ptlrpc/gss/gss_crypto.c +++ b/lustre/ptlrpc/gss/gss_crypto.c @@ -55,7 +55,7 @@ #include "gss_internal.h" #include "gss_crypto.h" -int gss_keyblock_init(struct gss_keyblock *kb, char *alg_name, +int gss_keyblock_init(struct gss_keyblock *kb, const char *alg_name, const int alg_mode) { int rc; @@ -254,7 +254,8 @@ int gss_crypt_generic(struct crypto_blkcipher *tfm, int decrypt, const void *iv, if (iv) memcpy(local_iv, iv, crypto_blkcipher_ivsize(tfm)); - memcpy(out, in, length); + if (in != out) + memmove(out, in, length); ret = gss_setup_sgtable(&sg_out, &sg, out, length); if (ret != 0) @@ -270,42 +271,28 @@ out: return ret; } -int gss_digest_hmac(struct crypto_hash *tfm, - rawobj_t *key, - rawobj_t *hdr, - int msgcnt, rawobj_t *msgs, - int iovcnt, lnet_kiov_t *iovs, - rawobj_t *cksum) +int gss_digest_hash(struct ahash_request *req, + rawobj_t *hdr, int msgcnt, rawobj_t *msgs, + int iovcnt, lnet_kiov_t *iovs) { - struct hash_desc desc = { - .tfm = tfm, - .flags = 0, - }; struct scatterlist sg[1]; struct sg_table sgt; + int rc = 0; int i; - int rc; - - rc = crypto_hash_setkey(tfm, key->data, key->len); - if (rc) - return rc; - - rc = crypto_hash_init(&desc); - if (rc) - return rc; for (i = 0; i < msgcnt; i++) { if (msgs[i].len == 0) continue; rc = gss_setup_sgtable(&sgt, sg, msgs[i].data, msgs[i].len); - if (rc != 0) - return rc; - rc = crypto_hash_update(&desc, sg, msgs[i].len); if (rc) return rc; + ahash_request_set_crypt(req, sg, NULL, msgs[i].len); + rc = crypto_ahash_update(req); gss_teardown_sgtable(&sgt); + if (rc) + return rc; } for (i = 0; i < iovcnt; i++) { @@ -315,59 +302,50 @@ int gss_digest_hmac(struct crypto_hash *tfm, sg_init_table(sg, 1); sg_set_page(&sg[0], iovs[i].kiov_page, iovs[i].kiov_len, iovs[i].kiov_offset); - rc = crypto_hash_update(&desc, sg, iovs[i].kiov_len); + + ahash_request_set_crypt(req, sg, NULL, iovs[i].kiov_len); + rc = crypto_ahash_update(req); if (rc) return rc; } if (hdr) { - rc = gss_setup_sgtable(&sgt, sg, hdr, sizeof(*hdr)); - if (rc != 0) - return rc; - rc = crypto_hash_update(&desc, sg, sizeof(hdr->len)); + rc = gss_setup_sgtable(&sgt, sg, hdr->data, hdr->len); if (rc) return rc; + ahash_request_set_crypt(req, sg, NULL, hdr->len); + rc = crypto_ahash_update(req); gss_teardown_sgtable(&sgt); + if (rc) + return rc; } - return crypto_hash_final(&desc, cksum->data); + return rc; } -int gss_digest_norm(struct crypto_hash *tfm, - struct gss_keyblock *kb, - rawobj_t *hdr, - int msgcnt, rawobj_t *msgs, - int iovcnt, lnet_kiov_t *iovs, - rawobj_t *cksum) +int gss_digest_hash_compat(struct ahash_request *req, + rawobj_t *hdr, int msgcnt, rawobj_t *msgs, + int iovcnt, lnet_kiov_t *iovs) { - struct hash_desc desc; struct scatterlist sg[1]; struct sg_table sgt; - int i; - int rc; - - LASSERT(kb->kb_tfm); - desc.tfm = tfm; - desc.flags = 0; - - rc = crypto_hash_init(&desc); - if (rc) - return rc; + int rc = 0; + int i; for (i = 0; i < msgcnt; i++) { if (msgs[i].len == 0) continue; rc = gss_setup_sgtable(&sgt, sg, msgs[i].data, msgs[i].len); - if (rc != 0) - return rc; - - rc = crypto_hash_update(&desc, sg, msgs[i].len); if (rc) return rc; + ahash_request_set_crypt(req, sg, NULL, msgs[i].len); + rc = crypto_ahash_update(req); gss_teardown_sgtable(&sgt); + if (rc) + return rc; } for (i = 0; i < iovcnt; i++) { @@ -377,29 +355,26 @@ int gss_digest_norm(struct crypto_hash *tfm, sg_init_table(sg, 1); sg_set_page(&sg[0], iovs[i].kiov_page, iovs[i].kiov_len, iovs[i].kiov_offset); - rc = crypto_hash_update(&desc, sg, iovs[i].kiov_len); + + ahash_request_set_crypt(req, sg, NULL, iovs[i].kiov_len); + rc = crypto_ahash_update(req); if (rc) return rc; } if (hdr) { - rc = gss_setup_sgtable(&sgt, sg, hdr, sizeof(*hdr)); - if (rc != 0) - return rc; - - rc = crypto_hash_update(&desc, sg, sizeof(*hdr)); + rc = gss_setup_sgtable(&sgt, sg, &(hdr->len), sizeof(hdr->len)); if (rc) return rc; + ahash_request_set_crypt(req, sg, NULL, sizeof(hdr->len)); + rc = crypto_ahash_update(req); gss_teardown_sgtable(&sgt); + if (rc) + return rc; } - rc = crypto_hash_final(&desc, cksum->data); - if (rc) - return rc; - - return gss_crypt_generic(kb->kb_tfm, 0, NULL, cksum->data, - cksum->data, cksum->len); + return rc; } int gss_add_padding(rawobj_t *msg, int msg_buflen, int blocksize)