Linux Audio

Check our new training course

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