988903f1dc8082989151d9f293629fc8bf7a6174
[platform/kernel/linux-exynos.git] / net / rxrpc / rxkad.c
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 {
151         struct rxrpc_skb_priv *sp;
152         SKCIPHER_REQUEST_ON_STACK(req, call->conn->cipher);
153         struct rxkad_level1_hdr hdr;
154         struct rxrpc_crypt iv;
155         struct scatterlist sg;
156         u16 check;
157
158         sp = rxrpc_skb(skb);
159
160         _enter("");
161
162         check = sp->hdr.seq ^ call->call_id;
163         data_size |= (u32)check << 16;
164
165         hdr.data_size = htonl(data_size);
166         memcpy(sechdr, &hdr, sizeof(hdr));
167
168         /* start the encryption afresh */
169         memset(&iv, 0, sizeof(iv));
170
171         sg_init_one(&sg, sechdr, 8);
172         skcipher_request_set_tfm(req, call->conn->cipher);
173         skcipher_request_set_callback(req, 0, NULL, NULL);
174         skcipher_request_set_crypt(req, &sg, &sg, 8, iv.x);
175         crypto_skcipher_encrypt(req);
176         skcipher_request_zero(req);
177
178         _leave(" = 0");
179         return 0;
180 }
181
182 /*
183  * wholly encrypt a packet (level 2 security)
184  */
185 static int rxkad_secure_packet_encrypt(const struct rxrpc_call *call,
186                                        struct sk_buff *skb,
187                                        u32 data_size,
188                                        void *sechdr)
189 {
190         const struct rxrpc_key_token *token;
191         struct rxkad_level2_hdr rxkhdr;
192         struct rxrpc_skb_priv *sp;
193         SKCIPHER_REQUEST_ON_STACK(req, call->conn->cipher);
194         struct rxrpc_crypt iv;
195         struct scatterlist sg[16];
196         struct sk_buff *trailer;
197         unsigned int len;
198         u16 check;
199         int nsg;
200         int err;
201
202         sp = rxrpc_skb(skb);
203
204         _enter("");
205
206         check = sp->hdr.seq ^ call->call_id;
207
208         rxkhdr.data_size = htonl(data_size | (u32)check << 16);
209         rxkhdr.checksum = 0;
210         memcpy(sechdr, &rxkhdr, sizeof(rxkhdr));
211
212         /* encrypt from the session key */
213         token = call->conn->params.key->payload.data[0];
214         memcpy(&iv, token->kad->session_key, sizeof(iv));
215
216         sg_init_one(&sg[0], sechdr, sizeof(rxkhdr));
217         skcipher_request_set_tfm(req, call->conn->cipher);
218         skcipher_request_set_callback(req, 0, NULL, NULL);
219         skcipher_request_set_crypt(req, &sg[0], &sg[0], sizeof(rxkhdr), iv.x);
220         crypto_skcipher_encrypt(req);
221
222         /* we want to encrypt the skbuff in-place */
223         nsg = skb_cow_data(skb, 0, &trailer);
224         err = -ENOMEM;
225         if (nsg < 0 || nsg > 16)
226                 goto out;
227
228         len = data_size + call->conn->size_align - 1;
229         len &= ~(call->conn->size_align - 1);
230
231         sg_init_table(sg, nsg);
232         skb_to_sgvec(skb, sg, 0, len);
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                 break;
301         case RXRPC_SECURITY_ENCRYPT:
302                 ret = rxkad_secure_packet_encrypt(call, skb, data_size,
303                                                   sechdr);
304                 break;
305         default:
306                 ret = -EPERM;
307                 break;
308         }
309
310         _leave(" = %d [set %hx]", ret, y);
311         return ret;
312 }
313
314 /*
315  * decrypt partial encryption on a packet (level 1 security)
316  */
317 static int rxkad_verify_packet_1(struct rxrpc_call *call, struct sk_buff *skb,
318                                  unsigned int offset, unsigned int len,
319                                  rxrpc_seq_t seq)
320 {
321         struct rxkad_level1_hdr sechdr;
322         SKCIPHER_REQUEST_ON_STACK(req, call->conn->cipher);
323         struct rxrpc_crypt iv;
324         struct scatterlist sg[16];
325         struct sk_buff *trailer;
326         u32 data_size, buf;
327         u16 check;
328         int nsg;
329
330         _enter("");
331
332         if (len < 8) {
333                 rxrpc_abort_call("V1H", call, seq, RXKADSEALEDINCON, -EPROTO);
334                 goto protocol_error;
335         }
336
337         /* Decrypt the skbuff in-place.  TODO: We really want to decrypt
338          * directly into the target buffer.
339          */
340         nsg = skb_cow_data(skb, 0, &trailer);
341         if (nsg < 0 || nsg > 16)
342                 goto nomem;
343
344         sg_init_table(sg, nsg);
345         skb_to_sgvec(skb, sg, offset, 8);
346
347         /* start the decryption afresh */
348         memset(&iv, 0, sizeof(iv));
349
350         skcipher_request_set_tfm(req, call->conn->cipher);
351         skcipher_request_set_callback(req, 0, NULL, NULL);
352         skcipher_request_set_crypt(req, sg, sg, 8, iv.x);
353         crypto_skcipher_decrypt(req);
354         skcipher_request_zero(req);
355
356         /* Extract the decrypted packet length */
357         if (skb_copy_bits(skb, offset, &sechdr, sizeof(sechdr)) < 0) {
358                 rxrpc_abort_call("XV1", call, seq, RXKADDATALEN, -EPROTO);
359                 goto protocol_error;
360         }
361         offset += sizeof(sechdr);
362         len -= sizeof(sechdr);
363
364         buf = ntohl(sechdr.data_size);
365         data_size = buf & 0xffff;
366
367         check = buf >> 16;
368         check ^= seq ^ call->call_id;
369         check &= 0xffff;
370         if (check != 0) {
371                 rxrpc_abort_call("V1C", call, seq, RXKADSEALEDINCON, -EPROTO);
372                 goto protocol_error;
373         }
374
375         if (data_size > len) {
376                 rxrpc_abort_call("V1L", call, seq, RXKADDATALEN, -EPROTO);
377                 goto protocol_error;
378         }
379
380         _leave(" = 0 [dlen=%x]", data_size);
381         return 0;
382
383 protocol_error:
384         rxrpc_send_abort_packet(call);
385         _leave(" = -EPROTO");
386         return -EPROTO;
387
388 nomem:
389         _leave(" = -ENOMEM");
390         return -ENOMEM;
391 }
392
393 /*
394  * wholly decrypt a packet (level 2 security)
395  */
396 static int rxkad_verify_packet_2(struct rxrpc_call *call, struct sk_buff *skb,
397                                  unsigned int offset, unsigned int len,
398                                  rxrpc_seq_t seq)
399 {
400         const struct rxrpc_key_token *token;
401         struct rxkad_level2_hdr sechdr;
402         SKCIPHER_REQUEST_ON_STACK(req, call->conn->cipher);
403         struct rxrpc_crypt iv;
404         struct scatterlist _sg[4], *sg;
405         struct sk_buff *trailer;
406         u32 data_size, buf;
407         u16 check;
408         int nsg;
409
410         _enter(",{%d}", skb->len);
411
412         if (len < 8) {
413                 rxrpc_abort_call("V2H", call, seq, RXKADSEALEDINCON, -EPROTO);
414                 goto protocol_error;
415         }
416
417         /* Decrypt the skbuff in-place.  TODO: We really want to decrypt
418          * directly into the target buffer.
419          */
420         nsg = skb_cow_data(skb, 0, &trailer);
421         if (nsg < 0)
422                 goto nomem;
423
424         sg = _sg;
425         if (unlikely(nsg > 4)) {
426                 sg = kmalloc(sizeof(*sg) * nsg, GFP_NOIO);
427                 if (!sg)
428                         goto nomem;
429         }
430
431         sg_init_table(sg, nsg);
432         skb_to_sgvec(skb, sg, offset, len);
433
434         /* decrypt from the session key */
435         token = call->conn->params.key->payload.data[0];
436         memcpy(&iv, token->kad->session_key, sizeof(iv));
437
438         skcipher_request_set_tfm(req, call->conn->cipher);
439         skcipher_request_set_callback(req, 0, NULL, NULL);
440         skcipher_request_set_crypt(req, sg, sg, len, iv.x);
441         crypto_skcipher_decrypt(req);
442         skcipher_request_zero(req);
443         if (sg != _sg)
444                 kfree(sg);
445
446         /* Extract the decrypted packet length */
447         if (skb_copy_bits(skb, offset, &sechdr, sizeof(sechdr)) < 0) {
448                 rxrpc_abort_call("XV2", call, seq, RXKADDATALEN, -EPROTO);
449                 goto protocol_error;
450         }
451         offset += sizeof(sechdr);
452         len -= sizeof(sechdr);
453
454         buf = ntohl(sechdr.data_size);
455         data_size = buf & 0xffff;
456
457         check = buf >> 16;
458         check ^= seq ^ call->call_id;
459         check &= 0xffff;
460         if (check != 0) {
461                 rxrpc_abort_call("V2C", call, seq, RXKADSEALEDINCON, -EPROTO);
462                 goto protocol_error;
463         }
464
465         if (data_size > len) {
466                 rxrpc_abort_call("V2L", call, seq, RXKADDATALEN, -EPROTO);
467                 goto protocol_error;
468         }
469
470         _leave(" = 0 [dlen=%x]", data_size);
471         return 0;
472
473 protocol_error:
474         rxrpc_send_abort_packet(call);
475         _leave(" = -EPROTO");
476         return -EPROTO;
477
478 nomem:
479         _leave(" = -ENOMEM");
480         return -ENOMEM;
481 }
482
483 /*
484  * Verify the security on a received packet or subpacket (if part of a
485  * jumbo packet).
486  */
487 static int rxkad_verify_packet(struct rxrpc_call *call, struct sk_buff *skb,
488                                unsigned int offset, unsigned int len,
489                                rxrpc_seq_t seq, u16 expected_cksum)
490 {
491         SKCIPHER_REQUEST_ON_STACK(req, call->conn->cipher);
492         struct rxrpc_crypt iv;
493         struct scatterlist sg;
494         u16 cksum;
495         u32 x, y;
496
497         _enter("{%d{%x}},{#%u}",
498                call->debug_id, key_serial(call->conn->params.key), seq);
499
500         if (!call->conn->cipher)
501                 return 0;
502
503         /* continue encrypting from where we left off */
504         memcpy(&iv, call->conn->csum_iv.x, sizeof(iv));
505
506         /* validate the security checksum */
507         x = (call->cid & RXRPC_CHANNELMASK) << (32 - RXRPC_CIDSHIFT);
508         x |= seq & 0x3fffffff;
509         call->crypto_buf[0] = htonl(call->call_id);
510         call->crypto_buf[1] = htonl(x);
511
512         sg_init_one(&sg, call->crypto_buf, 8);
513         skcipher_request_set_tfm(req, call->conn->cipher);
514         skcipher_request_set_callback(req, 0, NULL, NULL);
515         skcipher_request_set_crypt(req, &sg, &sg, 8, iv.x);
516         crypto_skcipher_encrypt(req);
517         skcipher_request_zero(req);
518
519         y = ntohl(call->crypto_buf[1]);
520         cksum = (y >> 16) & 0xffff;
521         if (cksum == 0)
522                 cksum = 1; /* zero checksums are not permitted */
523
524         if (cksum != expected_cksum) {
525                 rxrpc_abort_call("VCK", call, seq, RXKADSEALEDINCON, -EPROTO);
526                 rxrpc_send_abort_packet(call);
527                 _leave(" = -EPROTO [csum failed]");
528                 return -EPROTO;
529         }
530
531         switch (call->conn->params.security_level) {
532         case RXRPC_SECURITY_PLAIN:
533                 return 0;
534         case RXRPC_SECURITY_AUTH:
535                 return rxkad_verify_packet_1(call, skb, offset, len, seq);
536         case RXRPC_SECURITY_ENCRYPT:
537                 return rxkad_verify_packet_2(call, skb, offset, len, seq);
538         default:
539                 return -ENOANO;
540         }
541 }
542
543 /*
544  * Locate the data contained in a packet that was partially encrypted.
545  */
546 static void rxkad_locate_data_1(struct rxrpc_call *call, struct sk_buff *skb,
547                                 unsigned int *_offset, unsigned int *_len)
548 {
549         struct rxkad_level1_hdr sechdr;
550
551         if (skb_copy_bits(skb, *_offset, &sechdr, sizeof(sechdr)) < 0)
552                 BUG();
553         *_offset += sizeof(sechdr);
554         *_len = ntohl(sechdr.data_size) & 0xffff;
555 }
556
557 /*
558  * Locate the data contained in a packet that was completely encrypted.
559  */
560 static void rxkad_locate_data_2(struct rxrpc_call *call, struct sk_buff *skb,
561                                 unsigned int *_offset, unsigned int *_len)
562 {
563         struct rxkad_level2_hdr sechdr;
564
565         if (skb_copy_bits(skb, *_offset, &sechdr, sizeof(sechdr)) < 0)
566                 BUG();
567         *_offset += sizeof(sechdr);
568         *_len = ntohl(sechdr.data_size) & 0xffff;
569 }
570
571 /*
572  * Locate the data contained in an already decrypted packet.
573  */
574 static void rxkad_locate_data(struct rxrpc_call *call, struct sk_buff *skb,
575                               unsigned int *_offset, unsigned int *_len)
576 {
577         switch (call->conn->params.security_level) {
578         case RXRPC_SECURITY_AUTH:
579                 rxkad_locate_data_1(call, skb, _offset, _len);
580                 return;
581         case RXRPC_SECURITY_ENCRYPT:
582                 rxkad_locate_data_2(call, skb, _offset, _len);
583                 return;
584         default:
585                 return;
586         }
587 }
588
589 /*
590  * issue a challenge
591  */
592 static int rxkad_issue_challenge(struct rxrpc_connection *conn)
593 {
594         struct rxkad_challenge challenge;
595         struct rxrpc_wire_header whdr;
596         struct msghdr msg;
597         struct kvec iov[2];
598         size_t len;
599         u32 serial;
600         int ret;
601
602         _enter("{%d,%x}", conn->debug_id, key_serial(conn->params.key));
603
604         ret = key_validate(conn->params.key);
605         if (ret < 0)
606                 return ret;
607
608         get_random_bytes(&conn->security_nonce, sizeof(conn->security_nonce));
609
610         challenge.version       = htonl(2);
611         challenge.nonce         = htonl(conn->security_nonce);
612         challenge.min_level     = htonl(0);
613         challenge.__padding     = 0;
614
615         msg.msg_name    = &conn->params.peer->srx.transport.sin;
616         msg.msg_namelen = sizeof(conn->params.peer->srx.transport.sin);
617         msg.msg_control = NULL;
618         msg.msg_controllen = 0;
619         msg.msg_flags   = 0;
620
621         whdr.epoch      = htonl(conn->proto.epoch);
622         whdr.cid        = htonl(conn->proto.cid);
623         whdr.callNumber = 0;
624         whdr.seq        = 0;
625         whdr.type       = RXRPC_PACKET_TYPE_CHALLENGE;
626         whdr.flags      = conn->out_clientflag;
627         whdr.userStatus = 0;
628         whdr.securityIndex = conn->security_ix;
629         whdr._rsvd      = 0;
630         whdr.serviceId  = htons(conn->params.service_id);
631
632         iov[0].iov_base = &whdr;
633         iov[0].iov_len  = sizeof(whdr);
634         iov[1].iov_base = &challenge;
635         iov[1].iov_len  = sizeof(challenge);
636
637         len = iov[0].iov_len + iov[1].iov_len;
638
639         serial = atomic_inc_return(&conn->serial);
640         whdr.serial = htonl(serial);
641         _proto("Tx CHALLENGE %%%u", serial);
642
643         ret = kernel_sendmsg(conn->params.local->socket, &msg, iov, 2, len);
644         if (ret < 0) {
645                 _debug("sendmsg failed: %d", ret);
646                 return -EAGAIN;
647         }
648
649         _leave(" = 0");
650         return 0;
651 }
652
653 /*
654  * send a Kerberos security response
655  */
656 static int rxkad_send_response(struct rxrpc_connection *conn,
657                                struct rxrpc_host_header *hdr,
658                                struct rxkad_response *resp,
659                                const struct rxkad_key *s2)
660 {
661         struct rxrpc_wire_header whdr;
662         struct msghdr msg;
663         struct kvec iov[3];
664         size_t len;
665         u32 serial;
666         int ret;
667
668         _enter("");
669
670         msg.msg_name    = &conn->params.peer->srx.transport.sin;
671         msg.msg_namelen = sizeof(conn->params.peer->srx.transport.sin);
672         msg.msg_control = NULL;
673         msg.msg_controllen = 0;
674         msg.msg_flags   = 0;
675
676         memset(&whdr, 0, sizeof(whdr));
677         whdr.epoch      = htonl(hdr->epoch);
678         whdr.cid        = htonl(hdr->cid);
679         whdr.type       = RXRPC_PACKET_TYPE_RESPONSE;
680         whdr.flags      = conn->out_clientflag;
681         whdr.securityIndex = hdr->securityIndex;
682         whdr.serviceId  = htons(hdr->serviceId);
683
684         iov[0].iov_base = &whdr;
685         iov[0].iov_len  = sizeof(whdr);
686         iov[1].iov_base = resp;
687         iov[1].iov_len  = sizeof(*resp);
688         iov[2].iov_base = (void *)s2->ticket;
689         iov[2].iov_len  = s2->ticket_len;
690
691         len = iov[0].iov_len + iov[1].iov_len + iov[2].iov_len;
692
693         serial = atomic_inc_return(&conn->serial);
694         whdr.serial = htonl(serial);
695         _proto("Tx RESPONSE %%%u", serial);
696
697         ret = kernel_sendmsg(conn->params.local->socket, &msg, iov, 3, len);
698         if (ret < 0) {
699                 _debug("sendmsg failed: %d", ret);
700                 return -EAGAIN;
701         }
702
703         _leave(" = 0");
704         return 0;
705 }
706
707 /*
708  * calculate the response checksum
709  */
710 static void rxkad_calc_response_checksum(struct rxkad_response *response)
711 {
712         u32 csum = 1000003;
713         int loop;
714         u8 *p = (u8 *) response;
715
716         for (loop = sizeof(*response); loop > 0; loop--)
717                 csum = csum * 0x10204081 + *p++;
718
719         response->encrypted.checksum = htonl(csum);
720 }
721
722 /*
723  * encrypt the response packet
724  */
725 static void rxkad_encrypt_response(struct rxrpc_connection *conn,
726                                    struct rxkad_response *resp,
727                                    const struct rxkad_key *s2)
728 {
729         SKCIPHER_REQUEST_ON_STACK(req, conn->cipher);
730         struct rxrpc_crypt iv;
731         struct scatterlist sg[1];
732
733         /* continue encrypting from where we left off */
734         memcpy(&iv, s2->session_key, sizeof(iv));
735
736         sg_init_table(sg, 1);
737         sg_set_buf(sg, &resp->encrypted, sizeof(resp->encrypted));
738         skcipher_request_set_tfm(req, conn->cipher);
739         skcipher_request_set_callback(req, 0, NULL, NULL);
740         skcipher_request_set_crypt(req, sg, sg, sizeof(resp->encrypted), iv.x);
741         crypto_skcipher_encrypt(req);
742         skcipher_request_zero(req);
743 }
744
745 /*
746  * respond to a challenge packet
747  */
748 static int rxkad_respond_to_challenge(struct rxrpc_connection *conn,
749                                       struct sk_buff *skb,
750                                       u32 *_abort_code)
751 {
752         const struct rxrpc_key_token *token;
753         struct rxkad_challenge challenge;
754         struct rxkad_response resp
755                 __attribute__((aligned(8))); /* must be aligned for crypto */
756         struct rxrpc_skb_priv *sp = rxrpc_skb(skb);
757         u32 version, nonce, min_level, abort_code;
758         int ret;
759
760         _enter("{%d,%x}", conn->debug_id, key_serial(conn->params.key));
761
762         abort_code = RX_PROTOCOL_ERROR;
763         if (!conn->params.key)
764                 goto protocol_error;
765
766         abort_code = RXKADEXPIRED;
767         ret = key_validate(conn->params.key);
768         if (ret < 0)
769                 goto other_error;
770
771         abort_code = RXKADPACKETSHORT;
772         if (skb_copy_bits(skb, sizeof(struct rxrpc_wire_header),
773                           &challenge, sizeof(challenge)) < 0)
774                 goto protocol_error;
775
776         version = ntohl(challenge.version);
777         nonce = ntohl(challenge.nonce);
778         min_level = ntohl(challenge.min_level);
779
780         _proto("Rx CHALLENGE %%%u { v=%u n=%u ml=%u }",
781                sp->hdr.serial, version, nonce, min_level);
782
783         abort_code = RXKADINCONSISTENCY;
784         if (version != RXKAD_VERSION)
785                 goto protocol_error;
786
787         abort_code = RXKADLEVELFAIL;
788         ret = -EACCES;
789         if (conn->params.security_level < min_level)
790                 goto other_error;
791
792         token = conn->params.key->payload.data[0];
793
794         /* build the response packet */
795         memset(&resp, 0, sizeof(resp));
796
797         resp.version                    = htonl(RXKAD_VERSION);
798         resp.encrypted.epoch            = htonl(conn->proto.epoch);
799         resp.encrypted.cid              = htonl(conn->proto.cid);
800         resp.encrypted.securityIndex    = htonl(conn->security_ix);
801         resp.encrypted.inc_nonce        = htonl(nonce + 1);
802         resp.encrypted.level            = htonl(conn->params.security_level);
803         resp.kvno                       = htonl(token->kad->kvno);
804         resp.ticket_len                 = htonl(token->kad->ticket_len);
805
806         resp.encrypted.call_id[0] = htonl(conn->channels[0].call_counter);
807         resp.encrypted.call_id[1] = htonl(conn->channels[1].call_counter);
808         resp.encrypted.call_id[2] = htonl(conn->channels[2].call_counter);
809         resp.encrypted.call_id[3] = htonl(conn->channels[3].call_counter);
810
811         /* calculate the response checksum and then do the encryption */
812         rxkad_calc_response_checksum(&resp);
813         rxkad_encrypt_response(conn, &resp, token->kad);
814         return rxkad_send_response(conn, &sp->hdr, &resp, token->kad);
815
816 protocol_error:
817         ret = -EPROTO;
818 other_error:
819         *_abort_code = abort_code;
820         return ret;
821 }
822
823 /*
824  * decrypt the kerberos IV ticket in the response
825  */
826 static int rxkad_decrypt_ticket(struct rxrpc_connection *conn,
827                                 void *ticket, size_t ticket_len,
828                                 struct rxrpc_crypt *_session_key,
829                                 time_t *_expiry,
830                                 u32 *_abort_code)
831 {
832         struct skcipher_request *req;
833         struct rxrpc_crypt iv, key;
834         struct scatterlist sg[1];
835         struct in_addr addr;
836         unsigned int life;
837         time_t issue, now;
838         bool little_endian;
839         int ret;
840         u8 *p, *q, *name, *end;
841
842         _enter("{%d},{%x}", conn->debug_id, key_serial(conn->server_key));
843
844         *_expiry = 0;
845
846         ret = key_validate(conn->server_key);
847         if (ret < 0) {
848                 switch (ret) {
849                 case -EKEYEXPIRED:
850                         *_abort_code = RXKADEXPIRED;
851                         goto other_error;
852                 default:
853                         *_abort_code = RXKADNOAUTH;
854                         goto other_error;
855                 }
856         }
857
858         ASSERT(conn->server_key->payload.data[0] != NULL);
859         ASSERTCMP((unsigned long) ticket & 7UL, ==, 0);
860
861         memcpy(&iv, &conn->server_key->payload.data[2], sizeof(iv));
862
863         ret = -ENOMEM;
864         req = skcipher_request_alloc(conn->server_key->payload.data[0],
865                                      GFP_NOFS);
866         if (!req)
867                 goto temporary_error;
868
869         sg_init_one(&sg[0], ticket, ticket_len);
870         skcipher_request_set_callback(req, 0, NULL, NULL);
871         skcipher_request_set_crypt(req, sg, sg, ticket_len, iv.x);
872         crypto_skcipher_decrypt(req);
873         skcipher_request_free(req);
874
875         p = ticket;
876         end = p + ticket_len;
877
878 #define Z(size)                                         \
879         ({                                              \
880                 u8 *__str = p;                          \
881                 q = memchr(p, 0, end - p);              \
882                 if (!q || q - p > (size))               \
883                         goto bad_ticket;                \
884                 for (; p < q; p++)                      \
885                         if (!isprint(*p))               \
886                                 goto bad_ticket;        \
887                 p++;                                    \
888                 __str;                                  \
889         })
890
891         /* extract the ticket flags */
892         _debug("KIV FLAGS: %x", *p);
893         little_endian = *p & 1;
894         p++;
895
896         /* extract the authentication name */
897         name = Z(ANAME_SZ);
898         _debug("KIV ANAME: %s", name);
899
900         /* extract the principal's instance */
901         name = Z(INST_SZ);
902         _debug("KIV INST : %s", name);
903
904         /* extract the principal's authentication domain */
905         name = Z(REALM_SZ);
906         _debug("KIV REALM: %s", name);
907
908         if (end - p < 4 + 8 + 4 + 2)
909                 goto bad_ticket;
910
911         /* get the IPv4 address of the entity that requested the ticket */
912         memcpy(&addr, p, sizeof(addr));
913         p += 4;
914         _debug("KIV ADDR : %pI4", &addr);
915
916         /* get the session key from the ticket */
917         memcpy(&key, p, sizeof(key));
918         p += 8;
919         _debug("KIV KEY  : %08x %08x", ntohl(key.n[0]), ntohl(key.n[1]));
920         memcpy(_session_key, &key, sizeof(key));
921
922         /* get the ticket's lifetime */
923         life = *p++ * 5 * 60;
924         _debug("KIV LIFE : %u", life);
925
926         /* get the issue time of the ticket */
927         if (little_endian) {
928                 __le32 stamp;
929                 memcpy(&stamp, p, 4);
930                 issue = le32_to_cpu(stamp);
931         } else {
932                 __be32 stamp;
933                 memcpy(&stamp, p, 4);
934                 issue = be32_to_cpu(stamp);
935         }
936         p += 4;
937         now = get_seconds();
938         _debug("KIV ISSUE: %lx [%lx]", issue, now);
939
940         /* check the ticket is in date */
941         if (issue > now) {
942                 *_abort_code = RXKADNOAUTH;
943                 ret = -EKEYREJECTED;
944                 goto other_error;
945         }
946
947         if (issue < now - life) {
948                 *_abort_code = RXKADEXPIRED;
949                 ret = -EKEYEXPIRED;
950                 goto other_error;
951         }
952
953         *_expiry = issue + life;
954
955         /* get the service name */
956         name = Z(SNAME_SZ);
957         _debug("KIV SNAME: %s", name);
958
959         /* get the service instance name */
960         name = Z(INST_SZ);
961         _debug("KIV SINST: %s", name);
962         return 0;
963
964 bad_ticket:
965         *_abort_code = RXKADBADTICKET;
966         ret = -EPROTO;
967 other_error:
968         return ret;
969 temporary_error:
970         return ret;
971 }
972
973 /*
974  * decrypt the response packet
975  */
976 static void rxkad_decrypt_response(struct rxrpc_connection *conn,
977                                    struct rxkad_response *resp,
978                                    const struct rxrpc_crypt *session_key)
979 {
980         SKCIPHER_REQUEST_ON_STACK(req, rxkad_ci);
981         struct scatterlist sg[1];
982         struct rxrpc_crypt iv;
983
984         _enter(",,%08x%08x",
985                ntohl(session_key->n[0]), ntohl(session_key->n[1]));
986
987         ASSERT(rxkad_ci != NULL);
988
989         mutex_lock(&rxkad_ci_mutex);
990         if (crypto_skcipher_setkey(rxkad_ci, session_key->x,
991                                    sizeof(*session_key)) < 0)
992                 BUG();
993
994         memcpy(&iv, session_key, sizeof(iv));
995
996         sg_init_table(sg, 1);
997         sg_set_buf(sg, &resp->encrypted, sizeof(resp->encrypted));
998         skcipher_request_set_tfm(req, rxkad_ci);
999         skcipher_request_set_callback(req, 0, NULL, NULL);
1000         skcipher_request_set_crypt(req, sg, sg, sizeof(resp->encrypted), iv.x);
1001         crypto_skcipher_decrypt(req);
1002         skcipher_request_zero(req);
1003
1004         mutex_unlock(&rxkad_ci_mutex);
1005
1006         _leave("");
1007 }
1008
1009 /*
1010  * verify a response
1011  */
1012 static int rxkad_verify_response(struct rxrpc_connection *conn,
1013                                  struct sk_buff *skb,
1014                                  u32 *_abort_code)
1015 {
1016         struct rxkad_response response
1017                 __attribute__((aligned(8))); /* must be aligned for crypto */
1018         struct rxrpc_skb_priv *sp = rxrpc_skb(skb);
1019         struct rxrpc_crypt session_key;
1020         time_t expiry;
1021         void *ticket;
1022         u32 abort_code, version, kvno, ticket_len, level;
1023         __be32 csum;
1024         int ret, i;
1025
1026         _enter("{%d,%x}", conn->debug_id, key_serial(conn->server_key));
1027
1028         abort_code = RXKADPACKETSHORT;
1029         if (skb_copy_bits(skb, sizeof(struct rxrpc_wire_header),
1030                           &response, sizeof(response)) < 0)
1031                 goto protocol_error;
1032         if (!pskb_pull(skb, sizeof(response)))
1033                 BUG();
1034
1035         version = ntohl(response.version);
1036         ticket_len = ntohl(response.ticket_len);
1037         kvno = ntohl(response.kvno);
1038         _proto("Rx RESPONSE %%%u { v=%u kv=%u tl=%u }",
1039                sp->hdr.serial, version, kvno, ticket_len);
1040
1041         abort_code = RXKADINCONSISTENCY;
1042         if (version != RXKAD_VERSION)
1043                 goto protocol_error;
1044
1045         abort_code = RXKADTICKETLEN;
1046         if (ticket_len < 4 || ticket_len > MAXKRB5TICKETLEN)
1047                 goto protocol_error;
1048
1049         abort_code = RXKADUNKNOWNKEY;
1050         if (kvno >= RXKAD_TKT_TYPE_KERBEROS_V5)
1051                 goto protocol_error;
1052
1053         /* extract the kerberos ticket and decrypt and decode it */
1054         ret = -ENOMEM;
1055         ticket = kmalloc(ticket_len, GFP_NOFS);
1056         if (!ticket)
1057                 goto temporary_error;
1058
1059         abort_code = RXKADPACKETSHORT;
1060         if (skb_copy_bits(skb, sizeof(struct rxrpc_wire_header),
1061                           ticket, ticket_len) < 0)
1062                 goto protocol_error_free;
1063
1064         ret = rxkad_decrypt_ticket(conn, ticket, ticket_len, &session_key,
1065                                    &expiry, _abort_code);
1066         if (ret < 0)
1067                 goto temporary_error_free;
1068
1069         /* use the session key from inside the ticket to decrypt the
1070          * response */
1071         rxkad_decrypt_response(conn, &response, &session_key);
1072
1073         abort_code = RXKADSEALEDINCON;
1074         if (ntohl(response.encrypted.epoch) != conn->proto.epoch)
1075                 goto protocol_error_free;
1076         if (ntohl(response.encrypted.cid) != conn->proto.cid)
1077                 goto protocol_error_free;
1078         if (ntohl(response.encrypted.securityIndex) != conn->security_ix)
1079                 goto protocol_error_free;
1080         csum = response.encrypted.checksum;
1081         response.encrypted.checksum = 0;
1082         rxkad_calc_response_checksum(&response);
1083         if (response.encrypted.checksum != csum)
1084                 goto protocol_error_free;
1085
1086         spin_lock(&conn->channel_lock);
1087         for (i = 0; i < RXRPC_MAXCALLS; i++) {
1088                 struct rxrpc_call *call;
1089                 u32 call_id = ntohl(response.encrypted.call_id[i]);
1090
1091                 if (call_id > INT_MAX)
1092                         goto protocol_error_unlock;
1093
1094                 if (call_id < conn->channels[i].call_counter)
1095                         goto protocol_error_unlock;
1096                 if (call_id > conn->channels[i].call_counter) {
1097                         call = rcu_dereference_protected(
1098                                 conn->channels[i].call,
1099                                 lockdep_is_held(&conn->channel_lock));
1100                         if (call && call->state < RXRPC_CALL_COMPLETE)
1101                                 goto protocol_error_unlock;
1102                         conn->channels[i].call_counter = call_id;
1103                 }
1104         }
1105         spin_unlock(&conn->channel_lock);
1106
1107         abort_code = RXKADOUTOFSEQUENCE;
1108         if (ntohl(response.encrypted.inc_nonce) != conn->security_nonce + 1)
1109                 goto protocol_error_free;
1110
1111         abort_code = RXKADLEVELFAIL;
1112         level = ntohl(response.encrypted.level);
1113         if (level > RXRPC_SECURITY_ENCRYPT)
1114                 goto protocol_error_free;
1115         conn->params.security_level = level;
1116
1117         /* create a key to hold the security data and expiration time - after
1118          * this the connection security can be handled in exactly the same way
1119          * as for a client connection */
1120         ret = rxrpc_get_server_data_key(conn, &session_key, expiry, kvno);
1121         if (ret < 0)
1122                 goto temporary_error_free;
1123
1124         kfree(ticket);
1125         _leave(" = 0");
1126         return 0;
1127
1128 protocol_error_unlock:
1129         spin_unlock(&conn->channel_lock);
1130 protocol_error_free:
1131         kfree(ticket);
1132 protocol_error:
1133         *_abort_code = abort_code;
1134         _leave(" = -EPROTO [%d]", abort_code);
1135         return -EPROTO;
1136
1137 temporary_error_free:
1138         kfree(ticket);
1139 temporary_error:
1140         /* Ignore the response packet if we got a temporary error such as
1141          * ENOMEM.  We just want to send the challenge again.  Note that we
1142          * also come out this way if the ticket decryption fails.
1143          */
1144         return ret;
1145 }
1146
1147 /*
1148  * clear the connection security
1149  */
1150 static void rxkad_clear(struct rxrpc_connection *conn)
1151 {
1152         _enter("");
1153
1154         if (conn->cipher)
1155                 crypto_free_skcipher(conn->cipher);
1156 }
1157
1158 /*
1159  * Initialise the rxkad security service.
1160  */
1161 static int rxkad_init(void)
1162 {
1163         /* pin the cipher we need so that the crypto layer doesn't invoke
1164          * keventd to go get it */
1165         rxkad_ci = crypto_alloc_skcipher("pcbc(fcrypt)", 0, CRYPTO_ALG_ASYNC);
1166         return PTR_ERR_OR_ZERO(rxkad_ci);
1167 }
1168
1169 /*
1170  * Clean up the rxkad security service.
1171  */
1172 static void rxkad_exit(void)
1173 {
1174         if (rxkad_ci)
1175                 crypto_free_skcipher(rxkad_ci);
1176 }
1177
1178 /*
1179  * RxRPC Kerberos-based security
1180  */
1181 const struct rxrpc_security rxkad = {
1182         .name                           = "rxkad",
1183         .security_index                 = RXRPC_SECURITY_RXKAD,
1184         .init                           = rxkad_init,
1185         .exit                           = rxkad_exit,
1186         .init_connection_security       = rxkad_init_connection_security,
1187         .prime_packet_security          = rxkad_prime_packet_security,
1188         .secure_packet                  = rxkad_secure_packet,
1189         .verify_packet                  = rxkad_verify_packet,
1190         .locate_data                    = rxkad_locate_data,
1191         .issue_challenge                = rxkad_issue_challenge,
1192         .respond_to_challenge           = rxkad_respond_to_challenge,
1193         .verify_response                = rxkad_verify_response,
1194         .clear                          = rxkad_clear,
1195 };