1 /* 2 * linux/net/sunrpc/gss_krb5_crypto.c 3 * 4 * Copyright (c) 2000-2008 The Regents of the University of Michigan. 5 * All rights reserved. 6 * 7 * Andy Adamson <andros@umich.edu> 8 * Bruce Fields <bfields@umich.edu> 9 */ 10 11 /* 12 * Copyright (C) 1998 by the FundsXpress, INC. 13 * 14 * All rights reserved. 15 * 16 * Export of this software from the United States of America may require 17 * a specific license from the United States Government. It is the 18 * responsibility of any person or organization contemplating export to 19 * obtain such a license before exporting. 20 * 21 * WITHIN THAT CONSTRAINT, permission to use, copy, modify, and 22 * distribute this software and its documentation for any purpose and 23 * without fee is hereby granted, provided that the above copyright 24 * notice appear in all copies and that both that copyright notice and 25 * this permission notice appear in supporting documentation, and that 26 * the name of FundsXpress. not be used in advertising or publicity pertaining 27 * to distribution of the software without specific, written prior 28 * permission. FundsXpress makes no representations about the suitability of 29 * this software for any purpose. It is provided "as is" without express 30 * or implied warranty. 31 * 32 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR 33 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED 34 * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. 35 */ 36 37 #include <crypto/algapi.h> 38 #include <crypto/hash.h> 39 #include <crypto/skcipher.h> 40 #include <linux/err.h> 41 #include <linux/types.h> 42 #include <linux/mm.h> 43 #include <linux/scatterlist.h> 44 #include <linux/highmem.h> 45 #include <linux/pagemap.h> 46 #include <linux/random.h> 47 #include <linux/sunrpc/gss_krb5.h> 48 #include <linux/sunrpc/xdr.h> 49 50 #if IS_ENABLED(CONFIG_SUNRPC_DEBUG) 51 # define RPCDBG_FACILITY RPCDBG_AUTH 52 #endif 53 54 u32 55 krb5_encrypt( 56 struct crypto_sync_skcipher *tfm, 57 void * iv, 58 void * in, 59 void * out, 60 int length) 61 { 62 u32 ret = -EINVAL; 63 struct scatterlist sg[1]; 64 u8 local_iv[GSS_KRB5_MAX_BLOCKSIZE] = {0}; 65 SYNC_SKCIPHER_REQUEST_ON_STACK(req, tfm); 66 67 if (length % crypto_sync_skcipher_blocksize(tfm) != 0) 68 goto out; 69 70 if (crypto_sync_skcipher_ivsize(tfm) > GSS_KRB5_MAX_BLOCKSIZE) { 71 dprintk("RPC: gss_k5encrypt: tfm iv size too large %d\n", 72 crypto_sync_skcipher_ivsize(tfm)); 73 goto out; 74 } 75 76 if (iv) 77 memcpy(local_iv, iv, crypto_sync_skcipher_ivsize(tfm)); 78 79 memcpy(out, in, length); 80 sg_init_one(sg, out, length); 81 82 skcipher_request_set_sync_tfm(req, tfm); 83 skcipher_request_set_callback(req, 0, NULL, NULL); 84 skcipher_request_set_crypt(req, sg, sg, length, local_iv); 85 86 ret = crypto_skcipher_encrypt(req); 87 skcipher_request_zero(req); 88 out: 89 dprintk("RPC: krb5_encrypt returns %d\n", ret); 90 return ret; 91 } 92 93 u32 94 krb5_decrypt( 95 struct crypto_sync_skcipher *tfm, 96 void * iv, 97 void * in, 98 void * out, 99 int length) 100 { 101 u32 ret = -EINVAL; 102 struct scatterlist sg[1]; 103 u8 local_iv[GSS_KRB5_MAX_BLOCKSIZE] = {0}; 104 SYNC_SKCIPHER_REQUEST_ON_STACK(req, tfm); 105 106 if (length % crypto_sync_skcipher_blocksize(tfm) != 0) 107 goto out; 108 109 if (crypto_sync_skcipher_ivsize(tfm) > GSS_KRB5_MAX_BLOCKSIZE) { 110 dprintk("RPC: gss_k5decrypt: tfm iv size too large %d\n", 111 crypto_sync_skcipher_ivsize(tfm)); 112 goto out; 113 } 114 if (iv) 115 memcpy(local_iv, iv, crypto_sync_skcipher_ivsize(tfm)); 116 117 memcpy(out, in, length); 118 sg_init_one(sg, out, length); 119 120 skcipher_request_set_sync_tfm(req, tfm); 121 skcipher_request_set_callback(req, 0, NULL, NULL); 122 skcipher_request_set_crypt(req, sg, sg, length, local_iv); 123 124 ret = crypto_skcipher_decrypt(req); 125 skcipher_request_zero(req); 126 out: 127 dprintk("RPC: gss_k5decrypt returns %d\n",ret); 128 return ret; 129 } 130 131 static int 132 checksummer(struct scatterlist *sg, void *data) 133 { 134 struct ahash_request *req = data; 135 136 ahash_request_set_crypt(req, sg, NULL, sg->length); 137 138 return crypto_ahash_update(req); 139 } 140 141 static int 142 arcfour_hmac_md5_usage_to_salt(unsigned int usage, u8 salt[4]) 143 { 144 unsigned int ms_usage; 145 146 switch (usage) { 147 case KG_USAGE_SIGN: 148 ms_usage = 15; 149 break; 150 case KG_USAGE_SEAL: 151 ms_usage = 13; 152 break; 153 default: 154 return -EINVAL; 155 } 156 salt[0] = (ms_usage >> 0) & 0xff; 157 salt[1] = (ms_usage >> 8) & 0xff; 158 salt[2] = (ms_usage >> 16) & 0xff; 159 salt[3] = (ms_usage >> 24) & 0xff; 160 161 return 0; 162 } 163 164 static u32 165 make_checksum_hmac_md5(struct krb5_ctx *kctx, char *header, int hdrlen, 166 struct xdr_buf *body, int body_offset, u8 *cksumkey, 167 unsigned int usage, struct xdr_netobj *cksumout) 168 { 169 struct scatterlist sg[1]; 170 int err = -1; 171 u8 *checksumdata; 172 u8 *rc4salt; 173 struct crypto_ahash *md5; 174 struct crypto_ahash *hmac_md5; 175 struct ahash_request *req; 176 177 if (cksumkey == NULL) 178 return GSS_S_FAILURE; 179 180 if (cksumout->len < kctx->gk5e->cksumlength) { 181 dprintk("%s: checksum buffer length, %u, too small for %s\n", 182 __func__, cksumout->len, kctx->gk5e->name); 183 return GSS_S_FAILURE; 184 } 185 186 rc4salt = kmalloc_array(4, sizeof(*rc4salt), GFP_NOFS); 187 if (!rc4salt) 188 return GSS_S_FAILURE; 189 190 if (arcfour_hmac_md5_usage_to_salt(usage, rc4salt)) { 191 dprintk("%s: invalid usage value %u\n", __func__, usage); 192 goto out_free_rc4salt; 193 } 194 195 checksumdata = kmalloc(GSS_KRB5_MAX_CKSUM_LEN, GFP_NOFS); 196 if (!checksumdata) 197 goto out_free_rc4salt; 198 199 md5 = crypto_alloc_ahash("md5", 0, CRYPTO_ALG_ASYNC); 200 if (IS_ERR(md5)) 201 goto out_free_cksum; 202 203 hmac_md5 = crypto_alloc_ahash(kctx->gk5e->cksum_name, 0, 204 CRYPTO_ALG_ASYNC); 205 if (IS_ERR(hmac_md5)) 206 goto out_free_md5; 207 208 req = ahash_request_alloc(md5, GFP_NOFS); 209 if (!req) 210 goto out_free_hmac_md5; 211 212 ahash_request_set_callback(req, CRYPTO_TFM_REQ_MAY_SLEEP, NULL, NULL); 213 214 err = crypto_ahash_init(req); 215 if (err) 216 goto out; 217 sg_init_one(sg, rc4salt, 4); 218 ahash_request_set_crypt(req, sg, NULL, 4); 219 err = crypto_ahash_update(req); 220 if (err) 221 goto out; 222 223 sg_init_one(sg, header, hdrlen); 224 ahash_request_set_crypt(req, sg, NULL, hdrlen); 225 err = crypto_ahash_update(req); 226 if (err) 227 goto out; 228 err = xdr_process_buf(body, body_offset, body->len - body_offset, 229 checksummer, req); 230 if (err) 231 goto out; 232 ahash_request_set_crypt(req, NULL, checksumdata, 0); 233 err = crypto_ahash_final(req); 234 if (err) 235 goto out; 236 237 ahash_request_free(req); 238 req = ahash_request_alloc(hmac_md5, GFP_NOFS); 239 if (!req) 240 goto out_free_hmac_md5; 241 242 ahash_request_set_callback(req, CRYPTO_TFM_REQ_MAY_SLEEP, NULL, NULL); 243 244 err = crypto_ahash_setkey(hmac_md5, cksumkey, kctx->gk5e->keylength); 245 if (err) 246 goto out; 247 248 sg_init_one(sg, checksumdata, crypto_ahash_digestsize(md5)); 249 ahash_request_set_crypt(req, sg, checksumdata, 250 crypto_ahash_digestsize(md5)); 251 err = crypto_ahash_digest(req); 252 if (err) 253 goto out; 254 255 memcpy(cksumout->data, checksumdata, kctx->gk5e->cksumlength); 256 cksumout->len = kctx->gk5e->cksumlength; 257 out: 258 ahash_request_free(req); 259 out_free_hmac_md5: 260 crypto_free_ahash(hmac_md5); 261 out_free_md5: 262 crypto_free_ahash(md5); 263 out_free_cksum: 264 kfree(checksumdata); 265 out_free_rc4salt: 266 kfree(rc4salt); 267 return err ? GSS_S_FAILURE : 0; 268 } 269 270 /* 271 * checksum the plaintext data and hdrlen bytes of the token header 272 * The checksum is performed over the first 8 bytes of the 273 * gss token header and then over the data body 274 */ 275 u32 276 make_checksum(struct krb5_ctx *kctx, char *header, int hdrlen, 277 struct xdr_buf *body, int body_offset, u8 *cksumkey, 278 unsigned int usage, struct xdr_netobj *cksumout) 279 { 280 struct crypto_ahash *tfm; 281 struct ahash_request *req; 282 struct scatterlist sg[1]; 283 int err = -1; 284 u8 *checksumdata; 285 unsigned int checksumlen; 286 287 if (kctx->gk5e->ctype == CKSUMTYPE_HMAC_MD5_ARCFOUR) 288 return make_checksum_hmac_md5(kctx, header, hdrlen, 289 body, body_offset, 290 cksumkey, usage, cksumout); 291 292 if (cksumout->len < kctx->gk5e->cksumlength) { 293 dprintk("%s: checksum buffer length, %u, too small for %s\n", 294 __func__, cksumout->len, kctx->gk5e->name); 295 return GSS_S_FAILURE; 296 } 297 298 checksumdata = kmalloc(GSS_KRB5_MAX_CKSUM_LEN, GFP_NOFS); 299 if (checksumdata == NULL) 300 return GSS_S_FAILURE; 301 302 tfm = crypto_alloc_ahash(kctx->gk5e->cksum_name, 0, CRYPTO_ALG_ASYNC); 303 if (IS_ERR(tfm)) 304 goto out_free_cksum; 305 306 req = ahash_request_alloc(tfm, GFP_NOFS); 307 if (!req) 308 goto out_free_ahash; 309 310 ahash_request_set_callback(req, CRYPTO_TFM_REQ_MAY_SLEEP, NULL, NULL); 311 312 checksumlen = crypto_ahash_digestsize(tfm); 313 314 if (cksumkey != NULL) { 315 err = crypto_ahash_setkey(tfm, cksumkey, 316 kctx->gk5e->keylength); 317 if (err) 318 goto out; 319 } 320 321 err = crypto_ahash_init(req); 322 if (err) 323 goto out; 324 sg_init_one(sg, header, hdrlen); 325 ahash_request_set_crypt(req, sg, NULL, hdrlen); 326 err = crypto_ahash_update(req); 327 if (err) 328 goto out; 329 err = xdr_process_buf(body, body_offset, body->len - body_offset, 330 checksummer, req); 331 if (err) 332 goto out; 333 ahash_request_set_crypt(req, NULL, checksumdata, 0); 334 err = crypto_ahash_final(req); 335 if (err) 336 goto out; 337 338 switch (kctx->gk5e->ctype) { 339 case CKSUMTYPE_RSA_MD5: 340 err = kctx->gk5e->encrypt(kctx->seq, NULL, checksumdata, 341 checksumdata, checksumlen); 342 if (err) 343 goto out; 344 memcpy(cksumout->data, 345 checksumdata + checksumlen - kctx->gk5e->cksumlength, 346 kctx->gk5e->cksumlength); 347 break; 348 case CKSUMTYPE_HMAC_SHA1_DES3: 349 memcpy(cksumout->data, checksumdata, kctx->gk5e->cksumlength); 350 break; 351 default: 352 BUG(); 353 break; 354 } 355 cksumout->len = kctx->gk5e->cksumlength; 356 out: 357 ahash_request_free(req); 358 out_free_ahash: 359 crypto_free_ahash(tfm); 360 out_free_cksum: 361 kfree(checksumdata); 362 return err ? GSS_S_FAILURE : 0; 363 } 364 365 /* 366 * checksum the plaintext data and hdrlen bytes of the token header 367 * Per rfc4121, sec. 4.2.4, the checksum is performed over the data 368 * body then over the first 16 octets of the MIC token 369 * Inclusion of the header data in the calculation of the 370 * checksum is optional. 371 */ 372 u32 373 make_checksum_v2(struct krb5_ctx *kctx, char *header, int hdrlen, 374 struct xdr_buf *body, int body_offset, u8 *cksumkey, 375 unsigned int usage, struct xdr_netobj *cksumout) 376 { 377 struct crypto_ahash *tfm; 378 struct ahash_request *req; 379 struct scatterlist sg[1]; 380 int err = -1; 381 u8 *checksumdata; 382 383 if (kctx->gk5e->keyed_cksum == 0) { 384 dprintk("%s: expected keyed hash for %s\n", 385 __func__, kctx->gk5e->name); 386 return GSS_S_FAILURE; 387 } 388 if (cksumkey == NULL) { 389 dprintk("%s: no key supplied for %s\n", 390 __func__, kctx->gk5e->name); 391 return GSS_S_FAILURE; 392 } 393 394 checksumdata = kmalloc(GSS_KRB5_MAX_CKSUM_LEN, GFP_NOFS); 395 if (!checksumdata) 396 return GSS_S_FAILURE; 397 398 tfm = crypto_alloc_ahash(kctx->gk5e->cksum_name, 0, CRYPTO_ALG_ASYNC); 399 if (IS_ERR(tfm)) 400 goto out_free_cksum; 401 402 req = ahash_request_alloc(tfm, GFP_NOFS); 403 if (!req) 404 goto out_free_ahash; 405 406 ahash_request_set_callback(req, CRYPTO_TFM_REQ_MAY_SLEEP, NULL, NULL); 407 408 err = crypto_ahash_setkey(tfm, cksumkey, kctx->gk5e->keylength); 409 if (err) 410 goto out; 411 412 err = crypto_ahash_init(req); 413 if (err) 414 goto out; 415 err = xdr_process_buf(body, body_offset, body->len - body_offset, 416 checksummer, req); 417 if (err) 418 goto out; 419 if (header != NULL) { 420 sg_init_one(sg, header, hdrlen); 421 ahash_request_set_crypt(req, sg, NULL, hdrlen); 422 err = crypto_ahash_update(req); 423 if (err) 424 goto out; 425 } 426 ahash_request_set_crypt(req, NULL, checksumdata, 0); 427 err = crypto_ahash_final(req); 428 if (err) 429 goto out; 430 431 cksumout->len = kctx->gk5e->cksumlength; 432 433 switch (kctx->gk5e->ctype) { 434 case CKSUMTYPE_HMAC_SHA1_96_AES128: 435 case CKSUMTYPE_HMAC_SHA1_96_AES256: 436 /* note that this truncates the hash */ 437 memcpy(cksumout->data, checksumdata, kctx->gk5e->cksumlength); 438 break; 439 default: 440 BUG(); 441 break; 442 } 443 out: 444 ahash_request_free(req); 445 out_free_ahash: 446 crypto_free_ahash(tfm); 447 out_free_cksum: 448 kfree(checksumdata); 449 return err ? GSS_S_FAILURE : 0; 450 } 451 452 struct encryptor_desc { 453 u8 iv[GSS_KRB5_MAX_BLOCKSIZE]; 454 struct skcipher_request *req; 455 int pos; 456 struct xdr_buf *outbuf; 457 struct page **pages; 458 struct scatterlist infrags[4]; 459 struct scatterlist outfrags[4]; 460 int fragno; 461 int fraglen; 462 }; 463 464 static int 465 encryptor(struct scatterlist *sg, void *data) 466 { 467 struct encryptor_desc *desc = data; 468 struct xdr_buf *outbuf = desc->outbuf; 469 struct crypto_sync_skcipher *tfm = 470 crypto_sync_skcipher_reqtfm(desc->req); 471 struct page *in_page; 472 int thislen = desc->fraglen + sg->length; 473 int fraglen, ret; 474 int page_pos; 475 476 /* Worst case is 4 fragments: head, end of page 1, start 477 * of page 2, tail. Anything more is a bug. */ 478 BUG_ON(desc->fragno > 3); 479 480 page_pos = desc->pos - outbuf->head[0].iov_len; 481 if (page_pos >= 0 && page_pos < outbuf->page_len) { 482 /* pages are not in place: */ 483 int i = (page_pos + outbuf->page_base) >> PAGE_SHIFT; 484 in_page = desc->pages[i]; 485 } else { 486 in_page = sg_page(sg); 487 } 488 sg_set_page(&desc->infrags[desc->fragno], in_page, sg->length, 489 sg->offset); 490 sg_set_page(&desc->outfrags[desc->fragno], sg_page(sg), sg->length, 491 sg->offset); 492 desc->fragno++; 493 desc->fraglen += sg->length; 494 desc->pos += sg->length; 495 496 fraglen = thislen & (crypto_sync_skcipher_blocksize(tfm) - 1); 497 thislen -= fraglen; 498 499 if (thislen == 0) 500 return 0; 501 502 sg_mark_end(&desc->infrags[desc->fragno - 1]); 503 sg_mark_end(&desc->outfrags[desc->fragno - 1]); 504 505 skcipher_request_set_crypt(desc->req, desc->infrags, desc->outfrags, 506 thislen, desc->iv); 507 508 ret = crypto_skcipher_encrypt(desc->req); 509 if (ret) 510 return ret; 511 512 sg_init_table(desc->infrags, 4); 513 sg_init_table(desc->outfrags, 4); 514 515 if (fraglen) { 516 sg_set_page(&desc->outfrags[0], sg_page(sg), fraglen, 517 sg->offset + sg->length - fraglen); 518 desc->infrags[0] = desc->outfrags[0]; 519 sg_assign_page(&desc->infrags[0], in_page); 520 desc->fragno = 1; 521 desc->fraglen = fraglen; 522 } else { 523 desc->fragno = 0; 524 desc->fraglen = 0; 525 } 526 return 0; 527 } 528 529 int 530 gss_encrypt_xdr_buf(struct crypto_sync_skcipher *tfm, struct xdr_buf *buf, 531 int offset, struct page **pages) 532 { 533 int ret; 534 struct encryptor_desc desc; 535 SYNC_SKCIPHER_REQUEST_ON_STACK(req, tfm); 536 537 BUG_ON((buf->len - offset) % crypto_sync_skcipher_blocksize(tfm) != 0); 538 539 skcipher_request_set_sync_tfm(req, tfm); 540 skcipher_request_set_callback(req, 0, NULL, NULL); 541 542 memset(desc.iv, 0, sizeof(desc.iv)); 543 desc.req = req; 544 desc.pos = offset; 545 desc.outbuf = buf; 546 desc.pages = pages; 547 desc.fragno = 0; 548 desc.fraglen = 0; 549 550 sg_init_table(desc.infrags, 4); 551 sg_init_table(desc.outfrags, 4); 552 553 ret = xdr_process_buf(buf, offset, buf->len - offset, encryptor, &desc); 554 skcipher_request_zero(req); 555 return ret; 556 } 557 558 struct decryptor_desc { 559 u8 iv[GSS_KRB5_MAX_BLOCKSIZE]; 560 struct skcipher_request *req; 561 struct scatterlist frags[4]; 562 int fragno; 563 int fraglen; 564 }; 565 566 static int 567 decryptor(struct scatterlist *sg, void *data) 568 { 569 struct decryptor_desc *desc = data; 570 int thislen = desc->fraglen + sg->length; 571 struct crypto_sync_skcipher *tfm = 572 crypto_sync_skcipher_reqtfm(desc->req); 573 int fraglen, ret; 574 575 /* Worst case is 4 fragments: head, end of page 1, start 576 * of page 2, tail. Anything more is a bug. */ 577 BUG_ON(desc->fragno > 3); 578 sg_set_page(&desc->frags[desc->fragno], sg_page(sg), sg->length, 579 sg->offset); 580 desc->fragno++; 581 desc->fraglen += sg->length; 582 583 fraglen = thislen & (crypto_sync_skcipher_blocksize(tfm) - 1); 584 thislen -= fraglen; 585 586 if (thislen == 0) 587 return 0; 588 589 sg_mark_end(&desc->frags[desc->fragno - 1]); 590 591 skcipher_request_set_crypt(desc->req, desc->frags, desc->frags, 592 thislen, desc->iv); 593 594 ret = crypto_skcipher_decrypt(desc->req); 595 if (ret) 596 return ret; 597 598 sg_init_table(desc->frags, 4); 599 600 if (fraglen) { 601 sg_set_page(&desc->frags[0], sg_page(sg), fraglen, 602 sg->offset + sg->length - fraglen); 603 desc->fragno = 1; 604 desc->fraglen = fraglen; 605 } else { 606 desc->fragno = 0; 607 desc->fraglen = 0; 608 } 609 return 0; 610 } 611 612 int 613 gss_decrypt_xdr_buf(struct crypto_sync_skcipher *tfm, struct xdr_buf *buf, 614 int offset) 615 { 616 int ret; 617 struct decryptor_desc desc; 618 SYNC_SKCIPHER_REQUEST_ON_STACK(req, tfm); 619 620 /* XXXJBF: */ 621 BUG_ON((buf->len - offset) % crypto_sync_skcipher_blocksize(tfm) != 0); 622 623 skcipher_request_set_sync_tfm(req, tfm); 624 skcipher_request_set_callback(req, 0, NULL, NULL); 625 626 memset(desc.iv, 0, sizeof(desc.iv)); 627 desc.req = req; 628 desc.fragno = 0; 629 desc.fraglen = 0; 630 631 sg_init_table(desc.frags, 4); 632 633 ret = xdr_process_buf(buf, offset, buf->len - offset, decryptor, &desc); 634 skcipher_request_zero(req); 635 return ret; 636 } 637 638 /* 639 * This function makes the assumption that it was ultimately called 640 * from gss_wrap(). 641 * 642 * The client auth_gss code moves any existing tail data into a 643 * separate page before calling gss_wrap. 644 * The server svcauth_gss code ensures that both the head and the 645 * tail have slack space of RPC_MAX_AUTH_SIZE before calling gss_wrap. 646 * 647 * Even with that guarantee, this function may be called more than 648 * once in the processing of gss_wrap(). The best we can do is 649 * verify at compile-time (see GSS_KRB5_SLACK_CHECK) that the 650 * largest expected shift will fit within RPC_MAX_AUTH_SIZE. 651 * At run-time we can verify that a single invocation of this 652 * function doesn't attempt to use more the RPC_MAX_AUTH_SIZE. 653 */ 654 655 int 656 xdr_extend_head(struct xdr_buf *buf, unsigned int base, unsigned int shiftlen) 657 { 658 u8 *p; 659 660 if (shiftlen == 0) 661 return 0; 662 663 BUILD_BUG_ON(GSS_KRB5_MAX_SLACK_NEEDED > RPC_MAX_AUTH_SIZE); 664 BUG_ON(shiftlen > RPC_MAX_AUTH_SIZE); 665 666 p = buf->head[0].iov_base + base; 667 668 memmove(p + shiftlen, p, buf->head[0].iov_len - base); 669 670 buf->head[0].iov_len += shiftlen; 671 buf->len += shiftlen; 672 673 return 0; 674 } 675 676 static u32 677 gss_krb5_cts_crypt(struct crypto_sync_skcipher *cipher, struct xdr_buf *buf, 678 u32 offset, u8 *iv, struct page **pages, int encrypt) 679 { 680 u32 ret; 681 struct scatterlist sg[1]; 682 SYNC_SKCIPHER_REQUEST_ON_STACK(req, cipher); 683 u8 *data; 684 struct page **save_pages; 685 u32 len = buf->len - offset; 686 687 if (len > GSS_KRB5_MAX_BLOCKSIZE * 2) { 688 WARN_ON(0); 689 return -ENOMEM; 690 } 691 data = kmalloc(GSS_KRB5_MAX_BLOCKSIZE * 2, GFP_NOFS); 692 if (!data) 693 return -ENOMEM; 694 695 /* 696 * For encryption, we want to read from the cleartext 697 * page cache pages, and write the encrypted data to 698 * the supplied xdr_buf pages. 699 */ 700 save_pages = buf->pages; 701 if (encrypt) 702 buf->pages = pages; 703 704 ret = read_bytes_from_xdr_buf(buf, offset, data, len); 705 buf->pages = save_pages; 706 if (ret) 707 goto out; 708 709 sg_init_one(sg, data, len); 710 711 skcipher_request_set_sync_tfm(req, cipher); 712 skcipher_request_set_callback(req, 0, NULL, NULL); 713 skcipher_request_set_crypt(req, sg, sg, len, iv); 714 715 if (encrypt) 716 ret = crypto_skcipher_encrypt(req); 717 else 718 ret = crypto_skcipher_decrypt(req); 719 720 skcipher_request_zero(req); 721 722 if (ret) 723 goto out; 724 725 ret = write_bytes_to_xdr_buf(buf, offset, data, len); 726 727 out: 728 kfree(data); 729 return ret; 730 } 731 732 u32 733 gss_krb5_aes_encrypt(struct krb5_ctx *kctx, u32 offset, 734 struct xdr_buf *buf, struct page **pages) 735 { 736 u32 err; 737 struct xdr_netobj hmac; 738 u8 *cksumkey; 739 u8 *ecptr; 740 struct crypto_sync_skcipher *cipher, *aux_cipher; 741 int blocksize; 742 struct page **save_pages; 743 int nblocks, nbytes; 744 struct encryptor_desc desc; 745 u32 cbcbytes; 746 unsigned int usage; 747 748 if (kctx->initiate) { 749 cipher = kctx->initiator_enc; 750 aux_cipher = kctx->initiator_enc_aux; 751 cksumkey = kctx->initiator_integ; 752 usage = KG_USAGE_INITIATOR_SEAL; 753 } else { 754 cipher = kctx->acceptor_enc; 755 aux_cipher = kctx->acceptor_enc_aux; 756 cksumkey = kctx->acceptor_integ; 757 usage = KG_USAGE_ACCEPTOR_SEAL; 758 } 759 blocksize = crypto_sync_skcipher_blocksize(cipher); 760 761 /* hide the gss token header and insert the confounder */ 762 offset += GSS_KRB5_TOK_HDR_LEN; 763 if (xdr_extend_head(buf, offset, kctx->gk5e->conflen)) 764 return GSS_S_FAILURE; 765 gss_krb5_make_confounder(buf->head[0].iov_base + offset, kctx->gk5e->conflen); 766 offset -= GSS_KRB5_TOK_HDR_LEN; 767 768 if (buf->tail[0].iov_base != NULL) { 769 ecptr = buf->tail[0].iov_base + buf->tail[0].iov_len; 770 } else { 771 buf->tail[0].iov_base = buf->head[0].iov_base 772 + buf->head[0].iov_len; 773 buf->tail[0].iov_len = 0; 774 ecptr = buf->tail[0].iov_base; 775 } 776 777 /* copy plaintext gss token header after filler (if any) */ 778 memcpy(ecptr, buf->head[0].iov_base + offset, GSS_KRB5_TOK_HDR_LEN); 779 buf->tail[0].iov_len += GSS_KRB5_TOK_HDR_LEN; 780 buf->len += GSS_KRB5_TOK_HDR_LEN; 781 782 /* Do the HMAC */ 783 hmac.len = GSS_KRB5_MAX_CKSUM_LEN; 784 hmac.data = buf->tail[0].iov_base + buf->tail[0].iov_len; 785 786 /* 787 * When we are called, pages points to the real page cache 788 * data -- which we can't go and encrypt! buf->pages points 789 * to scratch pages which we are going to send off to the 790 * client/server. Swap in the plaintext pages to calculate 791 * the hmac. 792 */ 793 save_pages = buf->pages; 794 buf->pages = pages; 795 796 err = make_checksum_v2(kctx, NULL, 0, buf, 797 offset + GSS_KRB5_TOK_HDR_LEN, 798 cksumkey, usage, &hmac); 799 buf->pages = save_pages; 800 if (err) 801 return GSS_S_FAILURE; 802 803 nbytes = buf->len - offset - GSS_KRB5_TOK_HDR_LEN; 804 nblocks = (nbytes + blocksize - 1) / blocksize; 805 cbcbytes = 0; 806 if (nblocks > 2) 807 cbcbytes = (nblocks - 2) * blocksize; 808 809 memset(desc.iv, 0, sizeof(desc.iv)); 810 811 if (cbcbytes) { 812 SYNC_SKCIPHER_REQUEST_ON_STACK(req, aux_cipher); 813 814 desc.pos = offset + GSS_KRB5_TOK_HDR_LEN; 815 desc.fragno = 0; 816 desc.fraglen = 0; 817 desc.pages = pages; 818 desc.outbuf = buf; 819 desc.req = req; 820 821 skcipher_request_set_sync_tfm(req, aux_cipher); 822 skcipher_request_set_callback(req, 0, NULL, NULL); 823 824 sg_init_table(desc.infrags, 4); 825 sg_init_table(desc.outfrags, 4); 826 827 err = xdr_process_buf(buf, offset + GSS_KRB5_TOK_HDR_LEN, 828 cbcbytes, encryptor, &desc); 829 skcipher_request_zero(req); 830 if (err) 831 goto out_err; 832 } 833 834 /* Make sure IV carries forward from any CBC results. */ 835 err = gss_krb5_cts_crypt(cipher, buf, 836 offset + GSS_KRB5_TOK_HDR_LEN + cbcbytes, 837 desc.iv, pages, 1); 838 if (err) { 839 err = GSS_S_FAILURE; 840 goto out_err; 841 } 842 843 /* Now update buf to account for HMAC */ 844 buf->tail[0].iov_len += kctx->gk5e->cksumlength; 845 buf->len += kctx->gk5e->cksumlength; 846 847 out_err: 848 if (err) 849 err = GSS_S_FAILURE; 850 return err; 851 } 852 853 u32 854 gss_krb5_aes_decrypt(struct krb5_ctx *kctx, u32 offset, struct xdr_buf *buf, 855 u32 *headskip, u32 *tailskip) 856 { 857 struct xdr_buf subbuf; 858 u32 ret = 0; 859 u8 *cksum_key; 860 struct crypto_sync_skcipher *cipher, *aux_cipher; 861 struct xdr_netobj our_hmac_obj; 862 u8 our_hmac[GSS_KRB5_MAX_CKSUM_LEN]; 863 u8 pkt_hmac[GSS_KRB5_MAX_CKSUM_LEN]; 864 int nblocks, blocksize, cbcbytes; 865 struct decryptor_desc desc; 866 unsigned int usage; 867 868 if (kctx->initiate) { 869 cipher = kctx->acceptor_enc; 870 aux_cipher = kctx->acceptor_enc_aux; 871 cksum_key = kctx->acceptor_integ; 872 usage = KG_USAGE_ACCEPTOR_SEAL; 873 } else { 874 cipher = kctx->initiator_enc; 875 aux_cipher = kctx->initiator_enc_aux; 876 cksum_key = kctx->initiator_integ; 877 usage = KG_USAGE_INITIATOR_SEAL; 878 } 879 blocksize = crypto_sync_skcipher_blocksize(cipher); 880 881 882 /* create a segment skipping the header and leaving out the checksum */ 883 xdr_buf_subsegment(buf, &subbuf, offset + GSS_KRB5_TOK_HDR_LEN, 884 (buf->len - offset - GSS_KRB5_TOK_HDR_LEN - 885 kctx->gk5e->cksumlength)); 886 887 nblocks = (subbuf.len + blocksize - 1) / blocksize; 888 889 cbcbytes = 0; 890 if (nblocks > 2) 891 cbcbytes = (nblocks - 2) * blocksize; 892 893 memset(desc.iv, 0, sizeof(desc.iv)); 894 895 if (cbcbytes) { 896 SYNC_SKCIPHER_REQUEST_ON_STACK(req, aux_cipher); 897 898 desc.fragno = 0; 899 desc.fraglen = 0; 900 desc.req = req; 901 902 skcipher_request_set_sync_tfm(req, aux_cipher); 903 skcipher_request_set_callback(req, 0, NULL, NULL); 904 905 sg_init_table(desc.frags, 4); 906 907 ret = xdr_process_buf(&subbuf, 0, cbcbytes, decryptor, &desc); 908 skcipher_request_zero(req); 909 if (ret) 910 goto out_err; 911 } 912 913 /* Make sure IV carries forward from any CBC results. */ 914 ret = gss_krb5_cts_crypt(cipher, &subbuf, cbcbytes, desc.iv, NULL, 0); 915 if (ret) 916 goto out_err; 917 918 919 /* Calculate our hmac over the plaintext data */ 920 our_hmac_obj.len = sizeof(our_hmac); 921 our_hmac_obj.data = our_hmac; 922 923 ret = make_checksum_v2(kctx, NULL, 0, &subbuf, 0, 924 cksum_key, usage, &our_hmac_obj); 925 if (ret) 926 goto out_err; 927 928 /* Get the packet's hmac value */ 929 ret = read_bytes_from_xdr_buf(buf, buf->len - kctx->gk5e->cksumlength, 930 pkt_hmac, kctx->gk5e->cksumlength); 931 if (ret) 932 goto out_err; 933 934 if (crypto_memneq(pkt_hmac, our_hmac, kctx->gk5e->cksumlength) != 0) { 935 ret = GSS_S_BAD_SIG; 936 goto out_err; 937 } 938 *headskip = kctx->gk5e->conflen; 939 *tailskip = kctx->gk5e->cksumlength; 940 out_err: 941 if (ret && ret != GSS_S_BAD_SIG) 942 ret = GSS_S_FAILURE; 943 return ret; 944 } 945 946 /* 947 * Compute Kseq given the initial session key and the checksum. 948 * Set the key of the given cipher. 949 */ 950 int 951 krb5_rc4_setup_seq_key(struct krb5_ctx *kctx, 952 struct crypto_sync_skcipher *cipher, 953 unsigned char *cksum) 954 { 955 struct crypto_shash *hmac; 956 struct shash_desc *desc; 957 u8 Kseq[GSS_KRB5_MAX_KEYLEN]; 958 u32 zeroconstant = 0; 959 int err; 960 961 dprintk("%s: entered\n", __func__); 962 963 hmac = crypto_alloc_shash(kctx->gk5e->cksum_name, 0, 0); 964 if (IS_ERR(hmac)) { 965 dprintk("%s: error %ld, allocating hash '%s'\n", 966 __func__, PTR_ERR(hmac), kctx->gk5e->cksum_name); 967 return PTR_ERR(hmac); 968 } 969 970 desc = kmalloc(sizeof(*desc) + crypto_shash_descsize(hmac), 971 GFP_NOFS); 972 if (!desc) { 973 dprintk("%s: failed to allocate shash descriptor for '%s'\n", 974 __func__, kctx->gk5e->cksum_name); 975 crypto_free_shash(hmac); 976 return -ENOMEM; 977 } 978 979 desc->tfm = hmac; 980 desc->flags = 0; 981 982 /* Compute intermediate Kseq from session key */ 983 err = crypto_shash_setkey(hmac, kctx->Ksess, kctx->gk5e->keylength); 984 if (err) 985 goto out_err; 986 987 err = crypto_shash_digest(desc, (u8 *)&zeroconstant, 4, Kseq); 988 if (err) 989 goto out_err; 990 991 /* Compute final Kseq from the checksum and intermediate Kseq */ 992 err = crypto_shash_setkey(hmac, Kseq, kctx->gk5e->keylength); 993 if (err) 994 goto out_err; 995 996 err = crypto_shash_digest(desc, cksum, 8, Kseq); 997 if (err) 998 goto out_err; 999 1000 err = crypto_sync_skcipher_setkey(cipher, Kseq, kctx->gk5e->keylength); 1001 if (err) 1002 goto out_err; 1003 1004 err = 0; 1005 1006 out_err: 1007 kzfree(desc); 1008 crypto_free_shash(hmac); 1009 dprintk("%s: returning %d\n", __func__, err); 1010 return err; 1011 } 1012 1013 /* 1014 * Compute Kcrypt given the initial session key and the plaintext seqnum. 1015 * Set the key of cipher kctx->enc. 1016 */ 1017 int 1018 krb5_rc4_setup_enc_key(struct krb5_ctx *kctx, 1019 struct crypto_sync_skcipher *cipher, 1020 s32 seqnum) 1021 { 1022 struct crypto_shash *hmac; 1023 struct shash_desc *desc; 1024 u8 Kcrypt[GSS_KRB5_MAX_KEYLEN]; 1025 u8 zeroconstant[4] = {0}; 1026 u8 seqnumarray[4]; 1027 int err, i; 1028 1029 dprintk("%s: entered, seqnum %u\n", __func__, seqnum); 1030 1031 hmac = crypto_alloc_shash(kctx->gk5e->cksum_name, 0, 0); 1032 if (IS_ERR(hmac)) { 1033 dprintk("%s: error %ld, allocating hash '%s'\n", 1034 __func__, PTR_ERR(hmac), kctx->gk5e->cksum_name); 1035 return PTR_ERR(hmac); 1036 } 1037 1038 desc = kmalloc(sizeof(*desc) + crypto_shash_descsize(hmac), 1039 GFP_NOFS); 1040 if (!desc) { 1041 dprintk("%s: failed to allocate shash descriptor for '%s'\n", 1042 __func__, kctx->gk5e->cksum_name); 1043 crypto_free_shash(hmac); 1044 return -ENOMEM; 1045 } 1046 1047 desc->tfm = hmac; 1048 desc->flags = 0; 1049 1050 /* Compute intermediate Kcrypt from session key */ 1051 for (i = 0; i < kctx->gk5e->keylength; i++) 1052 Kcrypt[i] = kctx->Ksess[i] ^ 0xf0; 1053 1054 err = crypto_shash_setkey(hmac, Kcrypt, kctx->gk5e->keylength); 1055 if (err) 1056 goto out_err; 1057 1058 err = crypto_shash_digest(desc, zeroconstant, 4, Kcrypt); 1059 if (err) 1060 goto out_err; 1061 1062 /* Compute final Kcrypt from the seqnum and intermediate Kcrypt */ 1063 err = crypto_shash_setkey(hmac, Kcrypt, kctx->gk5e->keylength); 1064 if (err) 1065 goto out_err; 1066 1067 seqnumarray[0] = (unsigned char) ((seqnum >> 24) & 0xff); 1068 seqnumarray[1] = (unsigned char) ((seqnum >> 16) & 0xff); 1069 seqnumarray[2] = (unsigned char) ((seqnum >> 8) & 0xff); 1070 seqnumarray[3] = (unsigned char) ((seqnum >> 0) & 0xff); 1071 1072 err = crypto_shash_digest(desc, seqnumarray, 4, Kcrypt); 1073 if (err) 1074 goto out_err; 1075 1076 err = crypto_sync_skcipher_setkey(cipher, Kcrypt, 1077 kctx->gk5e->keylength); 1078 if (err) 1079 goto out_err; 1080 1081 err = 0; 1082 1083 out_err: 1084 kzfree(desc); 1085 crypto_free_shash(hmac); 1086 dprintk("%s: returning %d\n", __func__, err); 1087 return err; 1088 } 1089