1 /* Kerberos-based RxRPC security 2 * 3 * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. 4 * Written by David Howells (dhowells@redhat.com) 5 * 6 * This program is free software; you can redistribute it and/or 7 * modify it under the terms of the GNU General Public License 8 * as published by the Free Software Foundation; either version 9 * 2 of the License, or (at your option) any later version. 10 */ 11 12 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 13 14 #include <crypto/skcipher.h> 15 #include <linux/module.h> 16 #include <linux/net.h> 17 #include <linux/skbuff.h> 18 #include <linux/udp.h> 19 #include <linux/scatterlist.h> 20 #include <linux/ctype.h> 21 #include <linux/slab.h> 22 #include <net/sock.h> 23 #include <net/af_rxrpc.h> 24 #include <keys/rxrpc-type.h> 25 #include "ar-internal.h" 26 27 #define RXKAD_VERSION 2 28 #define MAXKRB5TICKETLEN 1024 29 #define RXKAD_TKT_TYPE_KERBEROS_V5 256 30 #define ANAME_SZ 40 /* size of authentication name */ 31 #define INST_SZ 40 /* size of principal's instance */ 32 #define REALM_SZ 40 /* size of principal's auth domain */ 33 #define SNAME_SZ 40 /* size of service name */ 34 35 struct rxkad_level1_hdr { 36 __be32 data_size; /* true data size (excluding padding) */ 37 }; 38 39 struct rxkad_level2_hdr { 40 __be32 data_size; /* true data size (excluding padding) */ 41 __be32 checksum; /* decrypted data checksum */ 42 }; 43 44 /* 45 * this holds a pinned cipher so that keventd doesn't get called by the cipher 46 * alloc routine, but since we have it to hand, we use it to decrypt RESPONSE 47 * packets 48 */ 49 static struct crypto_skcipher *rxkad_ci; 50 static DEFINE_MUTEX(rxkad_ci_mutex); 51 52 /* 53 * initialise connection security 54 */ 55 static int rxkad_init_connection_security(struct rxrpc_connection *conn) 56 { 57 struct crypto_skcipher *ci; 58 struct rxrpc_key_token *token; 59 int ret; 60 61 _enter("{%d},{%x}", conn->debug_id, key_serial(conn->params.key)); 62 63 token = conn->params.key->payload.data[0]; 64 conn->security_ix = token->security_index; 65 66 ci = crypto_alloc_skcipher("pcbc(fcrypt)", 0, CRYPTO_ALG_ASYNC); 67 if (IS_ERR(ci)) { 68 _debug("no cipher"); 69 ret = PTR_ERR(ci); 70 goto error; 71 } 72 73 if (crypto_skcipher_setkey(ci, token->kad->session_key, 74 sizeof(token->kad->session_key)) < 0) 75 BUG(); 76 77 switch (conn->params.security_level) { 78 case RXRPC_SECURITY_PLAIN: 79 break; 80 case RXRPC_SECURITY_AUTH: 81 conn->size_align = 8; 82 conn->security_size = sizeof(struct rxkad_level1_hdr); 83 break; 84 case RXRPC_SECURITY_ENCRYPT: 85 conn->size_align = 8; 86 conn->security_size = sizeof(struct rxkad_level2_hdr); 87 break; 88 default: 89 ret = -EKEYREJECTED; 90 goto error; 91 } 92 93 conn->cipher = ci; 94 ret = 0; 95 error: 96 _leave(" = %d", ret); 97 return ret; 98 } 99 100 /* 101 * prime the encryption state with the invariant parts of a connection's 102 * description 103 */ 104 static int rxkad_prime_packet_security(struct rxrpc_connection *conn) 105 { 106 struct rxrpc_key_token *token; 107 SKCIPHER_REQUEST_ON_STACK(req, conn->cipher); 108 struct scatterlist sg; 109 struct rxrpc_crypt iv; 110 __be32 *tmpbuf; 111 size_t tmpsize = 4 * sizeof(__be32); 112 113 _enter(""); 114 115 if (!conn->params.key) 116 return 0; 117 118 tmpbuf = kmalloc(tmpsize, GFP_KERNEL); 119 if (!tmpbuf) 120 return -ENOMEM; 121 122 token = conn->params.key->payload.data[0]; 123 memcpy(&iv, token->kad->session_key, sizeof(iv)); 124 125 tmpbuf[0] = htonl(conn->proto.epoch); 126 tmpbuf[1] = htonl(conn->proto.cid); 127 tmpbuf[2] = 0; 128 tmpbuf[3] = htonl(conn->security_ix); 129 130 sg_init_one(&sg, tmpbuf, tmpsize); 131 skcipher_request_set_tfm(req, conn->cipher); 132 skcipher_request_set_callback(req, 0, NULL, NULL); 133 skcipher_request_set_crypt(req, &sg, &sg, tmpsize, iv.x); 134 crypto_skcipher_encrypt(req); 135 skcipher_request_zero(req); 136 137 memcpy(&conn->csum_iv, tmpbuf + 2, sizeof(conn->csum_iv)); 138 kfree(tmpbuf); 139 _leave(" = 0"); 140 return 0; 141 } 142 143 /* 144 * partially encrypt a packet (level 1 security) 145 */ 146 static int rxkad_secure_packet_auth(const struct rxrpc_call *call, 147 struct sk_buff *skb, 148 u32 data_size, 149 void *sechdr, 150 struct skcipher_request *req) 151 { 152 struct rxrpc_skb_priv *sp = rxrpc_skb(skb); 153 struct rxkad_level1_hdr hdr; 154 struct rxrpc_crypt iv; 155 struct scatterlist sg; 156 u16 check; 157 158 _enter(""); 159 160 check = sp->hdr.seq ^ call->call_id; 161 data_size |= (u32)check << 16; 162 163 hdr.data_size = htonl(data_size); 164 memcpy(sechdr, &hdr, sizeof(hdr)); 165 166 /* start the encryption afresh */ 167 memset(&iv, 0, sizeof(iv)); 168 169 sg_init_one(&sg, sechdr, 8); 170 skcipher_request_set_tfm(req, call->conn->cipher); 171 skcipher_request_set_callback(req, 0, NULL, NULL); 172 skcipher_request_set_crypt(req, &sg, &sg, 8, iv.x); 173 crypto_skcipher_encrypt(req); 174 skcipher_request_zero(req); 175 176 _leave(" = 0"); 177 return 0; 178 } 179 180 /* 181 * wholly encrypt a packet (level 2 security) 182 */ 183 static int rxkad_secure_packet_encrypt(const struct rxrpc_call *call, 184 struct sk_buff *skb, 185 u32 data_size, 186 void *sechdr, 187 struct skcipher_request *req) 188 { 189 const struct rxrpc_key_token *token; 190 struct rxkad_level2_hdr rxkhdr; 191 struct rxrpc_skb_priv *sp; 192 struct rxrpc_crypt iv; 193 struct scatterlist sg[16]; 194 struct sk_buff *trailer; 195 unsigned int len; 196 u16 check; 197 int nsg; 198 int err; 199 200 sp = rxrpc_skb(skb); 201 202 _enter(""); 203 204 check = sp->hdr.seq ^ call->call_id; 205 206 rxkhdr.data_size = htonl(data_size | (u32)check << 16); 207 rxkhdr.checksum = 0; 208 memcpy(sechdr, &rxkhdr, sizeof(rxkhdr)); 209 210 /* encrypt from the session key */ 211 token = call->conn->params.key->payload.data[0]; 212 memcpy(&iv, token->kad->session_key, sizeof(iv)); 213 214 sg_init_one(&sg[0], sechdr, sizeof(rxkhdr)); 215 skcipher_request_set_tfm(req, call->conn->cipher); 216 skcipher_request_set_callback(req, 0, NULL, NULL); 217 skcipher_request_set_crypt(req, &sg[0], &sg[0], sizeof(rxkhdr), iv.x); 218 crypto_skcipher_encrypt(req); 219 220 /* we want to encrypt the skbuff in-place */ 221 nsg = skb_cow_data(skb, 0, &trailer); 222 err = -ENOMEM; 223 if (nsg < 0 || nsg > 16) 224 goto out; 225 226 len = data_size + call->conn->size_align - 1; 227 len &= ~(call->conn->size_align - 1); 228 229 sg_init_table(sg, nsg); 230 err = skb_to_sgvec(skb, sg, 0, len); 231 if (unlikely(err < 0)) 232 goto out; 233 skcipher_request_set_crypt(req, sg, sg, len, iv.x); 234 crypto_skcipher_encrypt(req); 235 236 _leave(" = 0"); 237 err = 0; 238 239 out: 240 skcipher_request_zero(req); 241 return err; 242 } 243 244 /* 245 * checksum an RxRPC packet header 246 */ 247 static int rxkad_secure_packet(struct rxrpc_call *call, 248 struct sk_buff *skb, 249 size_t data_size, 250 void *sechdr) 251 { 252 struct rxrpc_skb_priv *sp; 253 SKCIPHER_REQUEST_ON_STACK(req, call->conn->cipher); 254 struct rxrpc_crypt iv; 255 struct scatterlist sg; 256 u32 x, y; 257 int ret; 258 259 sp = rxrpc_skb(skb); 260 261 _enter("{%d{%x}},{#%u},%zu,", 262 call->debug_id, key_serial(call->conn->params.key), 263 sp->hdr.seq, data_size); 264 265 if (!call->conn->cipher) 266 return 0; 267 268 ret = key_validate(call->conn->params.key); 269 if (ret < 0) 270 return ret; 271 272 /* continue encrypting from where we left off */ 273 memcpy(&iv, call->conn->csum_iv.x, sizeof(iv)); 274 275 /* calculate the security checksum */ 276 x = (call->cid & RXRPC_CHANNELMASK) << (32 - RXRPC_CIDSHIFT); 277 x |= sp->hdr.seq & 0x3fffffff; 278 call->crypto_buf[0] = htonl(call->call_id); 279 call->crypto_buf[1] = htonl(x); 280 281 sg_init_one(&sg, call->crypto_buf, 8); 282 skcipher_request_set_tfm(req, call->conn->cipher); 283 skcipher_request_set_callback(req, 0, NULL, NULL); 284 skcipher_request_set_crypt(req, &sg, &sg, 8, iv.x); 285 crypto_skcipher_encrypt(req); 286 skcipher_request_zero(req); 287 288 y = ntohl(call->crypto_buf[1]); 289 y = (y >> 16) & 0xffff; 290 if (y == 0) 291 y = 1; /* zero checksums are not permitted */ 292 sp->hdr.cksum = y; 293 294 switch (call->conn->params.security_level) { 295 case RXRPC_SECURITY_PLAIN: 296 ret = 0; 297 break; 298 case RXRPC_SECURITY_AUTH: 299 ret = rxkad_secure_packet_auth(call, skb, data_size, sechdr, 300 req); 301 break; 302 case RXRPC_SECURITY_ENCRYPT: 303 ret = rxkad_secure_packet_encrypt(call, skb, data_size, 304 sechdr, req); 305 break; 306 default: 307 ret = -EPERM; 308 break; 309 } 310 311 _leave(" = %d [set %hx]", ret, y); 312 return ret; 313 } 314 315 /* 316 * decrypt partial encryption on a packet (level 1 security) 317 */ 318 static int rxkad_verify_packet_1(struct rxrpc_call *call, struct sk_buff *skb, 319 unsigned int offset, unsigned int len, 320 rxrpc_seq_t seq, 321 struct skcipher_request *req) 322 { 323 struct rxkad_level1_hdr sechdr; 324 struct rxrpc_crypt iv; 325 struct scatterlist sg[16]; 326 struct sk_buff *trailer; 327 bool aborted; 328 u32 data_size, buf; 329 u16 check; 330 int nsg, ret; 331 332 _enter(""); 333 334 if (len < 8) { 335 aborted = rxrpc_abort_eproto(call, skb, "rxkad_1_hdr", "V1H", 336 RXKADSEALEDINCON); 337 goto protocol_error; 338 } 339 340 /* Decrypt the skbuff in-place. TODO: We really want to decrypt 341 * directly into the target buffer. 342 */ 343 nsg = skb_cow_data(skb, 0, &trailer); 344 if (nsg < 0 || nsg > 16) 345 goto nomem; 346 347 sg_init_table(sg, nsg); 348 ret = skb_to_sgvec(skb, sg, offset, 8); 349 if (unlikely(ret < 0)) 350 return ret; 351 352 /* start the decryption afresh */ 353 memset(&iv, 0, sizeof(iv)); 354 355 skcipher_request_set_tfm(req, call->conn->cipher); 356 skcipher_request_set_callback(req, 0, NULL, NULL); 357 skcipher_request_set_crypt(req, sg, sg, 8, iv.x); 358 crypto_skcipher_decrypt(req); 359 skcipher_request_zero(req); 360 361 /* Extract the decrypted packet length */ 362 if (skb_copy_bits(skb, offset, &sechdr, sizeof(sechdr)) < 0) { 363 aborted = rxrpc_abort_eproto(call, skb, "rxkad_1_len", "XV1", 364 RXKADDATALEN); 365 goto protocol_error; 366 } 367 offset += sizeof(sechdr); 368 len -= sizeof(sechdr); 369 370 buf = ntohl(sechdr.data_size); 371 data_size = buf & 0xffff; 372 373 check = buf >> 16; 374 check ^= seq ^ call->call_id; 375 check &= 0xffff; 376 if (check != 0) { 377 aborted = rxrpc_abort_eproto(call, skb, "rxkad_1_check", "V1C", 378 RXKADSEALEDINCON); 379 goto protocol_error; 380 } 381 382 if (data_size > len) { 383 aborted = rxrpc_abort_eproto(call, skb, "rxkad_1_datalen", "V1L", 384 RXKADDATALEN); 385 goto protocol_error; 386 } 387 388 _leave(" = 0 [dlen=%x]", data_size); 389 return 0; 390 391 protocol_error: 392 if (aborted) 393 rxrpc_send_abort_packet(call); 394 return -EPROTO; 395 396 nomem: 397 _leave(" = -ENOMEM"); 398 return -ENOMEM; 399 } 400 401 /* 402 * wholly decrypt a packet (level 2 security) 403 */ 404 static int rxkad_verify_packet_2(struct rxrpc_call *call, struct sk_buff *skb, 405 unsigned int offset, unsigned int len, 406 rxrpc_seq_t seq, 407 struct skcipher_request *req) 408 { 409 const struct rxrpc_key_token *token; 410 struct rxkad_level2_hdr sechdr; 411 struct rxrpc_crypt iv; 412 struct scatterlist _sg[4], *sg; 413 struct sk_buff *trailer; 414 bool aborted; 415 u32 data_size, buf; 416 u16 check; 417 int nsg, ret; 418 419 _enter(",{%d}", skb->len); 420 421 if (len < 8) { 422 aborted = rxrpc_abort_eproto(call, skb, "rxkad_2_hdr", "V2H", 423 RXKADSEALEDINCON); 424 goto protocol_error; 425 } 426 427 /* Decrypt the skbuff in-place. TODO: We really want to decrypt 428 * directly into the target buffer. 429 */ 430 nsg = skb_cow_data(skb, 0, &trailer); 431 if (nsg < 0) 432 goto nomem; 433 434 sg = _sg; 435 if (unlikely(nsg > 4)) { 436 sg = kmalloc_array(nsg, sizeof(*sg), GFP_NOIO); 437 if (!sg) 438 goto nomem; 439 } 440 441 sg_init_table(sg, nsg); 442 ret = skb_to_sgvec(skb, sg, offset, len); 443 if (unlikely(ret < 0)) { 444 if (sg != _sg) 445 kfree(sg); 446 return ret; 447 } 448 449 /* decrypt from the session key */ 450 token = call->conn->params.key->payload.data[0]; 451 memcpy(&iv, token->kad->session_key, sizeof(iv)); 452 453 skcipher_request_set_tfm(req, call->conn->cipher); 454 skcipher_request_set_callback(req, 0, NULL, NULL); 455 skcipher_request_set_crypt(req, sg, sg, len, iv.x); 456 crypto_skcipher_decrypt(req); 457 skcipher_request_zero(req); 458 if (sg != _sg) 459 kfree(sg); 460 461 /* Extract the decrypted packet length */ 462 if (skb_copy_bits(skb, offset, &sechdr, sizeof(sechdr)) < 0) { 463 aborted = rxrpc_abort_eproto(call, skb, "rxkad_2_len", "XV2", 464 RXKADDATALEN); 465 goto protocol_error; 466 } 467 offset += sizeof(sechdr); 468 len -= sizeof(sechdr); 469 470 buf = ntohl(sechdr.data_size); 471 data_size = buf & 0xffff; 472 473 check = buf >> 16; 474 check ^= seq ^ call->call_id; 475 check &= 0xffff; 476 if (check != 0) { 477 aborted = rxrpc_abort_eproto(call, skb, "rxkad_2_check", "V2C", 478 RXKADSEALEDINCON); 479 goto protocol_error; 480 } 481 482 if (data_size > len) { 483 aborted = rxrpc_abort_eproto(call, skb, "rxkad_2_datalen", "V2L", 484 RXKADDATALEN); 485 goto protocol_error; 486 } 487 488 _leave(" = 0 [dlen=%x]", data_size); 489 return 0; 490 491 protocol_error: 492 if (aborted) 493 rxrpc_send_abort_packet(call); 494 return -EPROTO; 495 496 nomem: 497 _leave(" = -ENOMEM"); 498 return -ENOMEM; 499 } 500 501 /* 502 * Verify the security on a received packet or subpacket (if part of a 503 * jumbo packet). 504 */ 505 static int rxkad_verify_packet(struct rxrpc_call *call, struct sk_buff *skb, 506 unsigned int offset, unsigned int len, 507 rxrpc_seq_t seq, u16 expected_cksum) 508 { 509 SKCIPHER_REQUEST_ON_STACK(req, call->conn->cipher); 510 struct rxrpc_crypt iv; 511 struct scatterlist sg; 512 bool aborted; 513 u16 cksum; 514 u32 x, y; 515 516 _enter("{%d{%x}},{#%u}", 517 call->debug_id, key_serial(call->conn->params.key), seq); 518 519 if (!call->conn->cipher) 520 return 0; 521 522 /* continue encrypting from where we left off */ 523 memcpy(&iv, call->conn->csum_iv.x, sizeof(iv)); 524 525 /* validate the security checksum */ 526 x = (call->cid & RXRPC_CHANNELMASK) << (32 - RXRPC_CIDSHIFT); 527 x |= seq & 0x3fffffff; 528 call->crypto_buf[0] = htonl(call->call_id); 529 call->crypto_buf[1] = htonl(x); 530 531 sg_init_one(&sg, call->crypto_buf, 8); 532 skcipher_request_set_tfm(req, call->conn->cipher); 533 skcipher_request_set_callback(req, 0, NULL, NULL); 534 skcipher_request_set_crypt(req, &sg, &sg, 8, iv.x); 535 crypto_skcipher_encrypt(req); 536 skcipher_request_zero(req); 537 538 y = ntohl(call->crypto_buf[1]); 539 cksum = (y >> 16) & 0xffff; 540 if (cksum == 0) 541 cksum = 1; /* zero checksums are not permitted */ 542 543 if (cksum != expected_cksum) { 544 aborted = rxrpc_abort_eproto(call, skb, "rxkad_csum", "VCK", 545 RXKADSEALEDINCON); 546 goto protocol_error; 547 } 548 549 switch (call->conn->params.security_level) { 550 case RXRPC_SECURITY_PLAIN: 551 return 0; 552 case RXRPC_SECURITY_AUTH: 553 return rxkad_verify_packet_1(call, skb, offset, len, seq, req); 554 case RXRPC_SECURITY_ENCRYPT: 555 return rxkad_verify_packet_2(call, skb, offset, len, seq, req); 556 default: 557 return -ENOANO; 558 } 559 560 protocol_error: 561 if (aborted) 562 rxrpc_send_abort_packet(call); 563 return -EPROTO; 564 } 565 566 /* 567 * Locate the data contained in a packet that was partially encrypted. 568 */ 569 static void rxkad_locate_data_1(struct rxrpc_call *call, struct sk_buff *skb, 570 unsigned int *_offset, unsigned int *_len) 571 { 572 struct rxkad_level1_hdr sechdr; 573 574 if (skb_copy_bits(skb, *_offset, &sechdr, sizeof(sechdr)) < 0) 575 BUG(); 576 *_offset += sizeof(sechdr); 577 *_len = ntohl(sechdr.data_size) & 0xffff; 578 } 579 580 /* 581 * Locate the data contained in a packet that was completely encrypted. 582 */ 583 static void rxkad_locate_data_2(struct rxrpc_call *call, struct sk_buff *skb, 584 unsigned int *_offset, unsigned int *_len) 585 { 586 struct rxkad_level2_hdr sechdr; 587 588 if (skb_copy_bits(skb, *_offset, &sechdr, sizeof(sechdr)) < 0) 589 BUG(); 590 *_offset += sizeof(sechdr); 591 *_len = ntohl(sechdr.data_size) & 0xffff; 592 } 593 594 /* 595 * Locate the data contained in an already decrypted packet. 596 */ 597 static void rxkad_locate_data(struct rxrpc_call *call, struct sk_buff *skb, 598 unsigned int *_offset, unsigned int *_len) 599 { 600 switch (call->conn->params.security_level) { 601 case RXRPC_SECURITY_AUTH: 602 rxkad_locate_data_1(call, skb, _offset, _len); 603 return; 604 case RXRPC_SECURITY_ENCRYPT: 605 rxkad_locate_data_2(call, skb, _offset, _len); 606 return; 607 default: 608 return; 609 } 610 } 611 612 /* 613 * issue a challenge 614 */ 615 static int rxkad_issue_challenge(struct rxrpc_connection *conn) 616 { 617 struct rxkad_challenge challenge; 618 struct rxrpc_wire_header whdr; 619 struct msghdr msg; 620 struct kvec iov[2]; 621 size_t len; 622 u32 serial; 623 int ret; 624 625 _enter("{%d,%x}", conn->debug_id, key_serial(conn->params.key)); 626 627 ret = key_validate(conn->params.key); 628 if (ret < 0) 629 return ret; 630 631 get_random_bytes(&conn->security_nonce, sizeof(conn->security_nonce)); 632 633 challenge.version = htonl(2); 634 challenge.nonce = htonl(conn->security_nonce); 635 challenge.min_level = htonl(0); 636 challenge.__padding = 0; 637 638 msg.msg_name = &conn->params.peer->srx.transport; 639 msg.msg_namelen = conn->params.peer->srx.transport_len; 640 msg.msg_control = NULL; 641 msg.msg_controllen = 0; 642 msg.msg_flags = 0; 643 644 whdr.epoch = htonl(conn->proto.epoch); 645 whdr.cid = htonl(conn->proto.cid); 646 whdr.callNumber = 0; 647 whdr.seq = 0; 648 whdr.type = RXRPC_PACKET_TYPE_CHALLENGE; 649 whdr.flags = conn->out_clientflag; 650 whdr.userStatus = 0; 651 whdr.securityIndex = conn->security_ix; 652 whdr._rsvd = 0; 653 whdr.serviceId = htons(conn->service_id); 654 655 iov[0].iov_base = &whdr; 656 iov[0].iov_len = sizeof(whdr); 657 iov[1].iov_base = &challenge; 658 iov[1].iov_len = sizeof(challenge); 659 660 len = iov[0].iov_len + iov[1].iov_len; 661 662 serial = atomic_inc_return(&conn->serial); 663 whdr.serial = htonl(serial); 664 _proto("Tx CHALLENGE %%%u", serial); 665 666 ret = kernel_sendmsg(conn->params.local->socket, &msg, iov, 2, len); 667 if (ret < 0) { 668 trace_rxrpc_tx_fail(conn->debug_id, serial, ret, 669 rxrpc_tx_point_rxkad_challenge); 670 return -EAGAIN; 671 } 672 673 conn->params.peer->last_tx_at = ktime_get_seconds(); 674 trace_rxrpc_tx_packet(conn->debug_id, &whdr, 675 rxrpc_tx_point_rxkad_challenge); 676 _leave(" = 0"); 677 return 0; 678 } 679 680 /* 681 * send a Kerberos security response 682 */ 683 static int rxkad_send_response(struct rxrpc_connection *conn, 684 struct rxrpc_host_header *hdr, 685 struct rxkad_response *resp, 686 const struct rxkad_key *s2) 687 { 688 struct rxrpc_wire_header whdr; 689 struct msghdr msg; 690 struct kvec iov[3]; 691 size_t len; 692 u32 serial; 693 int ret; 694 695 _enter(""); 696 697 msg.msg_name = &conn->params.peer->srx.transport; 698 msg.msg_namelen = conn->params.peer->srx.transport_len; 699 msg.msg_control = NULL; 700 msg.msg_controllen = 0; 701 msg.msg_flags = 0; 702 703 memset(&whdr, 0, sizeof(whdr)); 704 whdr.epoch = htonl(hdr->epoch); 705 whdr.cid = htonl(hdr->cid); 706 whdr.type = RXRPC_PACKET_TYPE_RESPONSE; 707 whdr.flags = conn->out_clientflag; 708 whdr.securityIndex = hdr->securityIndex; 709 whdr.serviceId = htons(hdr->serviceId); 710 711 iov[0].iov_base = &whdr; 712 iov[0].iov_len = sizeof(whdr); 713 iov[1].iov_base = resp; 714 iov[1].iov_len = sizeof(*resp); 715 iov[2].iov_base = (void *)s2->ticket; 716 iov[2].iov_len = s2->ticket_len; 717 718 len = iov[0].iov_len + iov[1].iov_len + iov[2].iov_len; 719 720 serial = atomic_inc_return(&conn->serial); 721 whdr.serial = htonl(serial); 722 _proto("Tx RESPONSE %%%u", serial); 723 724 ret = kernel_sendmsg(conn->params.local->socket, &msg, iov, 3, len); 725 if (ret < 0) { 726 trace_rxrpc_tx_fail(conn->debug_id, serial, ret, 727 rxrpc_tx_point_rxkad_response); 728 return -EAGAIN; 729 } 730 731 conn->params.peer->last_tx_at = ktime_get_seconds(); 732 _leave(" = 0"); 733 return 0; 734 } 735 736 /* 737 * calculate the response checksum 738 */ 739 static void rxkad_calc_response_checksum(struct rxkad_response *response) 740 { 741 u32 csum = 1000003; 742 int loop; 743 u8 *p = (u8 *) response; 744 745 for (loop = sizeof(*response); loop > 0; loop--) 746 csum = csum * 0x10204081 + *p++; 747 748 response->encrypted.checksum = htonl(csum); 749 } 750 751 /* 752 * encrypt the response packet 753 */ 754 static void rxkad_encrypt_response(struct rxrpc_connection *conn, 755 struct rxkad_response *resp, 756 const struct rxkad_key *s2) 757 { 758 SKCIPHER_REQUEST_ON_STACK(req, conn->cipher); 759 struct rxrpc_crypt iv; 760 struct scatterlist sg[1]; 761 762 /* continue encrypting from where we left off */ 763 memcpy(&iv, s2->session_key, sizeof(iv)); 764 765 sg_init_table(sg, 1); 766 sg_set_buf(sg, &resp->encrypted, sizeof(resp->encrypted)); 767 skcipher_request_set_tfm(req, conn->cipher); 768 skcipher_request_set_callback(req, 0, NULL, NULL); 769 skcipher_request_set_crypt(req, sg, sg, sizeof(resp->encrypted), iv.x); 770 crypto_skcipher_encrypt(req); 771 skcipher_request_zero(req); 772 } 773 774 /* 775 * respond to a challenge packet 776 */ 777 static int rxkad_respond_to_challenge(struct rxrpc_connection *conn, 778 struct sk_buff *skb, 779 u32 *_abort_code) 780 { 781 const struct rxrpc_key_token *token; 782 struct rxkad_challenge challenge; 783 struct rxkad_response *resp; 784 struct rxrpc_skb_priv *sp = rxrpc_skb(skb); 785 const char *eproto; 786 u32 version, nonce, min_level, abort_code; 787 int ret; 788 789 _enter("{%d,%x}", conn->debug_id, key_serial(conn->params.key)); 790 791 eproto = tracepoint_string("chall_no_key"); 792 abort_code = RX_PROTOCOL_ERROR; 793 if (!conn->params.key) 794 goto protocol_error; 795 796 abort_code = RXKADEXPIRED; 797 ret = key_validate(conn->params.key); 798 if (ret < 0) 799 goto other_error; 800 801 eproto = tracepoint_string("chall_short"); 802 abort_code = RXKADPACKETSHORT; 803 if (skb_copy_bits(skb, sizeof(struct rxrpc_wire_header), 804 &challenge, sizeof(challenge)) < 0) 805 goto protocol_error; 806 807 version = ntohl(challenge.version); 808 nonce = ntohl(challenge.nonce); 809 min_level = ntohl(challenge.min_level); 810 811 _proto("Rx CHALLENGE %%%u { v=%u n=%u ml=%u }", 812 sp->hdr.serial, version, nonce, min_level); 813 814 eproto = tracepoint_string("chall_ver"); 815 abort_code = RXKADINCONSISTENCY; 816 if (version != RXKAD_VERSION) 817 goto protocol_error; 818 819 abort_code = RXKADLEVELFAIL; 820 ret = -EACCES; 821 if (conn->params.security_level < min_level) 822 goto other_error; 823 824 token = conn->params.key->payload.data[0]; 825 826 /* build the response packet */ 827 resp = kzalloc(sizeof(struct rxkad_response), GFP_NOFS); 828 if (!resp) 829 return -ENOMEM; 830 831 resp->version = htonl(RXKAD_VERSION); 832 resp->encrypted.epoch = htonl(conn->proto.epoch); 833 resp->encrypted.cid = htonl(conn->proto.cid); 834 resp->encrypted.securityIndex = htonl(conn->security_ix); 835 resp->encrypted.inc_nonce = htonl(nonce + 1); 836 resp->encrypted.level = htonl(conn->params.security_level); 837 resp->kvno = htonl(token->kad->kvno); 838 resp->ticket_len = htonl(token->kad->ticket_len); 839 resp->encrypted.call_id[0] = htonl(conn->channels[0].call_counter); 840 resp->encrypted.call_id[1] = htonl(conn->channels[1].call_counter); 841 resp->encrypted.call_id[2] = htonl(conn->channels[2].call_counter); 842 resp->encrypted.call_id[3] = htonl(conn->channels[3].call_counter); 843 844 /* calculate the response checksum and then do the encryption */ 845 rxkad_calc_response_checksum(resp); 846 rxkad_encrypt_response(conn, resp, token->kad); 847 ret = rxkad_send_response(conn, &sp->hdr, resp, token->kad); 848 kfree(resp); 849 return ret; 850 851 protocol_error: 852 trace_rxrpc_rx_eproto(NULL, sp->hdr.serial, eproto); 853 ret = -EPROTO; 854 other_error: 855 *_abort_code = abort_code; 856 return ret; 857 } 858 859 /* 860 * decrypt the kerberos IV ticket in the response 861 */ 862 static int rxkad_decrypt_ticket(struct rxrpc_connection *conn, 863 struct sk_buff *skb, 864 void *ticket, size_t ticket_len, 865 struct rxrpc_crypt *_session_key, 866 time64_t *_expiry, 867 u32 *_abort_code) 868 { 869 struct skcipher_request *req; 870 struct rxrpc_skb_priv *sp = rxrpc_skb(skb); 871 struct rxrpc_crypt iv, key; 872 struct scatterlist sg[1]; 873 struct in_addr addr; 874 unsigned int life; 875 const char *eproto; 876 time64_t issue, now; 877 bool little_endian; 878 int ret; 879 u32 abort_code; 880 u8 *p, *q, *name, *end; 881 882 _enter("{%d},{%x}", conn->debug_id, key_serial(conn->server_key)); 883 884 *_expiry = 0; 885 886 ret = key_validate(conn->server_key); 887 if (ret < 0) { 888 switch (ret) { 889 case -EKEYEXPIRED: 890 abort_code = RXKADEXPIRED; 891 goto other_error; 892 default: 893 abort_code = RXKADNOAUTH; 894 goto other_error; 895 } 896 } 897 898 ASSERT(conn->server_key->payload.data[0] != NULL); 899 ASSERTCMP((unsigned long) ticket & 7UL, ==, 0); 900 901 memcpy(&iv, &conn->server_key->payload.data[2], sizeof(iv)); 902 903 ret = -ENOMEM; 904 req = skcipher_request_alloc(conn->server_key->payload.data[0], 905 GFP_NOFS); 906 if (!req) 907 goto temporary_error; 908 909 sg_init_one(&sg[0], ticket, ticket_len); 910 skcipher_request_set_callback(req, 0, NULL, NULL); 911 skcipher_request_set_crypt(req, sg, sg, ticket_len, iv.x); 912 crypto_skcipher_decrypt(req); 913 skcipher_request_free(req); 914 915 p = ticket; 916 end = p + ticket_len; 917 918 #define Z(field) \ 919 ({ \ 920 u8 *__str = p; \ 921 eproto = tracepoint_string("rxkad_bad_"#field); \ 922 q = memchr(p, 0, end - p); \ 923 if (!q || q - p > (field##_SZ)) \ 924 goto bad_ticket; \ 925 for (; p < q; p++) \ 926 if (!isprint(*p)) \ 927 goto bad_ticket; \ 928 p++; \ 929 __str; \ 930 }) 931 932 /* extract the ticket flags */ 933 _debug("KIV FLAGS: %x", *p); 934 little_endian = *p & 1; 935 p++; 936 937 /* extract the authentication name */ 938 name = Z(ANAME); 939 _debug("KIV ANAME: %s", name); 940 941 /* extract the principal's instance */ 942 name = Z(INST); 943 _debug("KIV INST : %s", name); 944 945 /* extract the principal's authentication domain */ 946 name = Z(REALM); 947 _debug("KIV REALM: %s", name); 948 949 eproto = tracepoint_string("rxkad_bad_len"); 950 if (end - p < 4 + 8 + 4 + 2) 951 goto bad_ticket; 952 953 /* get the IPv4 address of the entity that requested the ticket */ 954 memcpy(&addr, p, sizeof(addr)); 955 p += 4; 956 _debug("KIV ADDR : %pI4", &addr); 957 958 /* get the session key from the ticket */ 959 memcpy(&key, p, sizeof(key)); 960 p += 8; 961 _debug("KIV KEY : %08x %08x", ntohl(key.n[0]), ntohl(key.n[1])); 962 memcpy(_session_key, &key, sizeof(key)); 963 964 /* get the ticket's lifetime */ 965 life = *p++ * 5 * 60; 966 _debug("KIV LIFE : %u", life); 967 968 /* get the issue time of the ticket */ 969 if (little_endian) { 970 __le32 stamp; 971 memcpy(&stamp, p, 4); 972 issue = rxrpc_u32_to_time64(le32_to_cpu(stamp)); 973 } else { 974 __be32 stamp; 975 memcpy(&stamp, p, 4); 976 issue = rxrpc_u32_to_time64(be32_to_cpu(stamp)); 977 } 978 p += 4; 979 now = ktime_get_real_seconds(); 980 _debug("KIV ISSUE: %llx [%llx]", issue, now); 981 982 /* check the ticket is in date */ 983 if (issue > now) { 984 abort_code = RXKADNOAUTH; 985 ret = -EKEYREJECTED; 986 goto other_error; 987 } 988 989 if (issue < now - life) { 990 abort_code = RXKADEXPIRED; 991 ret = -EKEYEXPIRED; 992 goto other_error; 993 } 994 995 *_expiry = issue + life; 996 997 /* get the service name */ 998 name = Z(SNAME); 999 _debug("KIV SNAME: %s", name); 1000 1001 /* get the service instance name */ 1002 name = Z(INST); 1003 _debug("KIV SINST: %s", name); 1004 return 0; 1005 1006 bad_ticket: 1007 trace_rxrpc_rx_eproto(NULL, sp->hdr.serial, eproto); 1008 abort_code = RXKADBADTICKET; 1009 ret = -EPROTO; 1010 other_error: 1011 *_abort_code = abort_code; 1012 return ret; 1013 temporary_error: 1014 return ret; 1015 } 1016 1017 /* 1018 * decrypt the response packet 1019 */ 1020 static void rxkad_decrypt_response(struct rxrpc_connection *conn, 1021 struct rxkad_response *resp, 1022 const struct rxrpc_crypt *session_key) 1023 { 1024 SKCIPHER_REQUEST_ON_STACK(req, rxkad_ci); 1025 struct scatterlist sg[1]; 1026 struct rxrpc_crypt iv; 1027 1028 _enter(",,%08x%08x", 1029 ntohl(session_key->n[0]), ntohl(session_key->n[1])); 1030 1031 ASSERT(rxkad_ci != NULL); 1032 1033 mutex_lock(&rxkad_ci_mutex); 1034 if (crypto_skcipher_setkey(rxkad_ci, session_key->x, 1035 sizeof(*session_key)) < 0) 1036 BUG(); 1037 1038 memcpy(&iv, session_key, sizeof(iv)); 1039 1040 sg_init_table(sg, 1); 1041 sg_set_buf(sg, &resp->encrypted, sizeof(resp->encrypted)); 1042 skcipher_request_set_tfm(req, rxkad_ci); 1043 skcipher_request_set_callback(req, 0, NULL, NULL); 1044 skcipher_request_set_crypt(req, sg, sg, sizeof(resp->encrypted), iv.x); 1045 crypto_skcipher_decrypt(req); 1046 skcipher_request_zero(req); 1047 1048 mutex_unlock(&rxkad_ci_mutex); 1049 1050 _leave(""); 1051 } 1052 1053 /* 1054 * verify a response 1055 */ 1056 static int rxkad_verify_response(struct rxrpc_connection *conn, 1057 struct sk_buff *skb, 1058 u32 *_abort_code) 1059 { 1060 struct rxkad_response *response; 1061 struct rxrpc_skb_priv *sp = rxrpc_skb(skb); 1062 struct rxrpc_crypt session_key; 1063 const char *eproto; 1064 time64_t expiry; 1065 void *ticket; 1066 u32 abort_code, version, kvno, ticket_len, level; 1067 __be32 csum; 1068 int ret, i; 1069 1070 _enter("{%d,%x}", conn->debug_id, key_serial(conn->server_key)); 1071 1072 ret = -ENOMEM; 1073 response = kzalloc(sizeof(struct rxkad_response), GFP_NOFS); 1074 if (!response) 1075 goto temporary_error; 1076 1077 eproto = tracepoint_string("rxkad_rsp_short"); 1078 abort_code = RXKADPACKETSHORT; 1079 if (skb_copy_bits(skb, sizeof(struct rxrpc_wire_header), 1080 response, sizeof(*response)) < 0) 1081 goto protocol_error; 1082 if (!pskb_pull(skb, sizeof(*response))) 1083 BUG(); 1084 1085 version = ntohl(response->version); 1086 ticket_len = ntohl(response->ticket_len); 1087 kvno = ntohl(response->kvno); 1088 _proto("Rx RESPONSE %%%u { v=%u kv=%u tl=%u }", 1089 sp->hdr.serial, version, kvno, ticket_len); 1090 1091 eproto = tracepoint_string("rxkad_rsp_ver"); 1092 abort_code = RXKADINCONSISTENCY; 1093 if (version != RXKAD_VERSION) 1094 goto protocol_error; 1095 1096 eproto = tracepoint_string("rxkad_rsp_tktlen"); 1097 abort_code = RXKADTICKETLEN; 1098 if (ticket_len < 4 || ticket_len > MAXKRB5TICKETLEN) 1099 goto protocol_error; 1100 1101 eproto = tracepoint_string("rxkad_rsp_unkkey"); 1102 abort_code = RXKADUNKNOWNKEY; 1103 if (kvno >= RXKAD_TKT_TYPE_KERBEROS_V5) 1104 goto protocol_error; 1105 1106 /* extract the kerberos ticket and decrypt and decode it */ 1107 ret = -ENOMEM; 1108 ticket = kmalloc(ticket_len, GFP_NOFS); 1109 if (!ticket) 1110 goto temporary_error; 1111 1112 eproto = tracepoint_string("rxkad_tkt_short"); 1113 abort_code = RXKADPACKETSHORT; 1114 if (skb_copy_bits(skb, sizeof(struct rxrpc_wire_header), 1115 ticket, ticket_len) < 0) 1116 goto protocol_error_free; 1117 1118 ret = rxkad_decrypt_ticket(conn, skb, ticket, ticket_len, &session_key, 1119 &expiry, _abort_code); 1120 if (ret < 0) 1121 goto temporary_error_free_resp; 1122 1123 /* use the session key from inside the ticket to decrypt the 1124 * response */ 1125 rxkad_decrypt_response(conn, response, &session_key); 1126 1127 eproto = tracepoint_string("rxkad_rsp_param"); 1128 abort_code = RXKADSEALEDINCON; 1129 if (ntohl(response->encrypted.epoch) != conn->proto.epoch) 1130 goto protocol_error_free; 1131 if (ntohl(response->encrypted.cid) != conn->proto.cid) 1132 goto protocol_error_free; 1133 if (ntohl(response->encrypted.securityIndex) != conn->security_ix) 1134 goto protocol_error_free; 1135 csum = response->encrypted.checksum; 1136 response->encrypted.checksum = 0; 1137 rxkad_calc_response_checksum(response); 1138 eproto = tracepoint_string("rxkad_rsp_csum"); 1139 if (response->encrypted.checksum != csum) 1140 goto protocol_error_free; 1141 1142 spin_lock(&conn->channel_lock); 1143 for (i = 0; i < RXRPC_MAXCALLS; i++) { 1144 struct rxrpc_call *call; 1145 u32 call_id = ntohl(response->encrypted.call_id[i]); 1146 1147 eproto = tracepoint_string("rxkad_rsp_callid"); 1148 if (call_id > INT_MAX) 1149 goto protocol_error_unlock; 1150 1151 eproto = tracepoint_string("rxkad_rsp_callctr"); 1152 if (call_id < conn->channels[i].call_counter) 1153 goto protocol_error_unlock; 1154 1155 eproto = tracepoint_string("rxkad_rsp_callst"); 1156 if (call_id > conn->channels[i].call_counter) { 1157 call = rcu_dereference_protected( 1158 conn->channels[i].call, 1159 lockdep_is_held(&conn->channel_lock)); 1160 if (call && call->state < RXRPC_CALL_COMPLETE) 1161 goto protocol_error_unlock; 1162 conn->channels[i].call_counter = call_id; 1163 } 1164 } 1165 spin_unlock(&conn->channel_lock); 1166 1167 eproto = tracepoint_string("rxkad_rsp_seq"); 1168 abort_code = RXKADOUTOFSEQUENCE; 1169 if (ntohl(response->encrypted.inc_nonce) != conn->security_nonce + 1) 1170 goto protocol_error_free; 1171 1172 eproto = tracepoint_string("rxkad_rsp_level"); 1173 abort_code = RXKADLEVELFAIL; 1174 level = ntohl(response->encrypted.level); 1175 if (level > RXRPC_SECURITY_ENCRYPT) 1176 goto protocol_error_free; 1177 conn->params.security_level = level; 1178 1179 /* create a key to hold the security data and expiration time - after 1180 * this the connection security can be handled in exactly the same way 1181 * as for a client connection */ 1182 ret = rxrpc_get_server_data_key(conn, &session_key, expiry, kvno); 1183 if (ret < 0) 1184 goto temporary_error_free_ticket; 1185 1186 kfree(ticket); 1187 kfree(response); 1188 _leave(" = 0"); 1189 return 0; 1190 1191 protocol_error_unlock: 1192 spin_unlock(&conn->channel_lock); 1193 protocol_error_free: 1194 kfree(ticket); 1195 protocol_error: 1196 kfree(response); 1197 trace_rxrpc_rx_eproto(NULL, sp->hdr.serial, eproto); 1198 *_abort_code = abort_code; 1199 return -EPROTO; 1200 1201 temporary_error_free_ticket: 1202 kfree(ticket); 1203 temporary_error_free_resp: 1204 kfree(response); 1205 temporary_error: 1206 /* Ignore the response packet if we got a temporary error such as 1207 * ENOMEM. We just want to send the challenge again. Note that we 1208 * also come out this way if the ticket decryption fails. 1209 */ 1210 return ret; 1211 } 1212 1213 /* 1214 * clear the connection security 1215 */ 1216 static void rxkad_clear(struct rxrpc_connection *conn) 1217 { 1218 _enter(""); 1219 1220 if (conn->cipher) 1221 crypto_free_skcipher(conn->cipher); 1222 } 1223 1224 /* 1225 * Initialise the rxkad security service. 1226 */ 1227 static int rxkad_init(void) 1228 { 1229 /* pin the cipher we need so that the crypto layer doesn't invoke 1230 * keventd to go get it */ 1231 rxkad_ci = crypto_alloc_skcipher("pcbc(fcrypt)", 0, CRYPTO_ALG_ASYNC); 1232 return PTR_ERR_OR_ZERO(rxkad_ci); 1233 } 1234 1235 /* 1236 * Clean up the rxkad security service. 1237 */ 1238 static void rxkad_exit(void) 1239 { 1240 if (rxkad_ci) 1241 crypto_free_skcipher(rxkad_ci); 1242 } 1243 1244 /* 1245 * RxRPC Kerberos-based security 1246 */ 1247 const struct rxrpc_security rxkad = { 1248 .name = "rxkad", 1249 .security_index = RXRPC_SECURITY_RXKAD, 1250 .init = rxkad_init, 1251 .exit = rxkad_exit, 1252 .init_connection_security = rxkad_init_connection_security, 1253 .prime_packet_security = rxkad_prime_packet_security, 1254 .secure_packet = rxkad_secure_packet, 1255 .verify_packet = rxkad_verify_packet, 1256 .locate_data = rxkad_locate_data, 1257 .issue_challenge = rxkad_issue_challenge, 1258 .respond_to_challenge = rxkad_respond_to_challenge, 1259 .verify_response = rxkad_verify_response, 1260 .clear = rxkad_clear, 1261 }; 1262