rxrpc: Clone received jumbo subpackets and queue separately
[platform/kernel/linux-rpi.git] / net / rxrpc / rxkad.c
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
33 struct rxkad_level1_hdr {
34         __be32  data_size;      /* true data size (excluding padding) */
35 };
36
37 struct rxkad_level2_hdr {
38         __be32  data_size;      /* true data size (excluding padding) */
39         __be32  checksum;       /* decrypted data checksum */
40 };
41
42 static 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  */
50 static struct crypto_sync_skcipher *rxkad_ci;
51 static struct skcipher_request *rxkad_ci_req;
52 static 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  */
59 static 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
82 static 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
89 static 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  */
100 static 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
138 error_ci:
139         crypto_free_sync_skcipher(ci);
140 error:
141         _leave(" = %d", ret);
142         return ret;
143 }
144
145 /*
146  * Work out how much data we can put in a packet.
147  */
148 static 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
172 out:
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  */
183 static 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  */
233 static 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  */
251 static 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  */
261 static 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  */
303 static 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
361 out:
362         skcipher_request_zero(req);
363         return err;
364 }
365
366 /*
367  * checksum an RxRPC packet header
368  */
369 static 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 %x]", ret, y);
435         return ret;
436 }
437
438 /*
439  * decrypt partial encryption on a packet (level 1 security)
440  */
441 static int rxkad_verify_packet_1(struct rxrpc_call *call, struct sk_buff *skb,
442                                  rxrpc_seq_t seq,
443                                  struct skcipher_request *req)
444 {
445         struct rxkad_level1_hdr sechdr;
446         struct rxrpc_skb_priv *sp = rxrpc_skb(skb);
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 (sp->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, sp->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, sp->offset, &sechdr, sizeof(sechdr)) < 0) {
481                 aborted = rxrpc_abort_eproto(call, skb, "rxkad_1_len", "XV1",
482                                              RXKADDATALEN);
483                 goto protocol_error;
484         }
485         sp->offset += sizeof(sechdr);
486         sp->len    -= sizeof(sechdr);
487
488         buf = ntohl(sechdr.data_size);
489         data_size = buf & 0xffff;
490
491         check = buf >> 16;
492         check ^= seq ^ call->call_id;
493         check &= 0xffff;
494         if (check != 0) {
495                 aborted = rxrpc_abort_eproto(call, skb, "rxkad_1_check", "V1C",
496                                              RXKADSEALEDINCON);
497                 goto protocol_error;
498         }
499
500         if (data_size > sp->len) {
501                 aborted = rxrpc_abort_eproto(call, skb, "rxkad_1_datalen", "V1L",
502                                              RXKADDATALEN);
503                 goto protocol_error;
504         }
505         sp->len = data_size;
506
507         _leave(" = 0 [dlen=%x]", data_size);
508         return 0;
509
510 protocol_error:
511         if (aborted)
512                 rxrpc_send_abort_packet(call);
513         return -EPROTO;
514 }
515
516 /*
517  * wholly decrypt a packet (level 2 security)
518  */
519 static int rxkad_verify_packet_2(struct rxrpc_call *call, struct sk_buff *skb,
520                                  rxrpc_seq_t seq,
521                                  struct skcipher_request *req)
522 {
523         const struct rxrpc_key_token *token;
524         struct rxkad_level2_hdr sechdr;
525         struct rxrpc_skb_priv *sp = rxrpc_skb(skb);
526         struct rxrpc_crypt iv;
527         struct scatterlist _sg[4], *sg;
528         bool aborted;
529         u32 data_size, buf;
530         u16 check;
531         int nsg, ret;
532
533         _enter(",{%d}", sp->len);
534
535         if (sp->len < 8) {
536                 aborted = rxrpc_abort_eproto(call, skb, "rxkad_2_hdr", "V2H",
537                                              RXKADSEALEDINCON);
538                 goto protocol_error;
539         }
540
541         /* Decrypt the skbuff in-place.  TODO: We really want to decrypt
542          * directly into the target buffer.
543          */
544         sg = _sg;
545         nsg = skb_shinfo(skb)->nr_frags + 1;
546         if (nsg <= 4) {
547                 nsg = 4;
548         } else {
549                 sg = kmalloc_array(nsg, sizeof(*sg), GFP_NOIO);
550                 if (!sg)
551                         goto nomem;
552         }
553
554         sg_init_table(sg, nsg);
555         ret = skb_to_sgvec(skb, sg, sp->offset, sp->len);
556         if (unlikely(ret < 0)) {
557                 if (sg != _sg)
558                         kfree(sg);
559                 return ret;
560         }
561
562         /* decrypt from the session key */
563         token = call->conn->params.key->payload.data[0];
564         memcpy(&iv, token->kad->session_key, sizeof(iv));
565
566         skcipher_request_set_sync_tfm(req, call->conn->rxkad.cipher);
567         skcipher_request_set_callback(req, 0, NULL, NULL);
568         skcipher_request_set_crypt(req, sg, sg, sp->len, iv.x);
569         crypto_skcipher_decrypt(req);
570         skcipher_request_zero(req);
571         if (sg != _sg)
572                 kfree(sg);
573
574         /* Extract the decrypted packet length */
575         if (skb_copy_bits(skb, sp->offset, &sechdr, sizeof(sechdr)) < 0) {
576                 aborted = rxrpc_abort_eproto(call, skb, "rxkad_2_len", "XV2",
577                                              RXKADDATALEN);
578                 goto protocol_error;
579         }
580         sp->offset += sizeof(sechdr);
581         sp->len    -= sizeof(sechdr);
582
583         buf = ntohl(sechdr.data_size);
584         data_size = buf & 0xffff;
585
586         check = buf >> 16;
587         check ^= seq ^ call->call_id;
588         check &= 0xffff;
589         if (check != 0) {
590                 aborted = rxrpc_abort_eproto(call, skb, "rxkad_2_check", "V2C",
591                                              RXKADSEALEDINCON);
592                 goto protocol_error;
593         }
594
595         if (data_size > sp->len) {
596                 aborted = rxrpc_abort_eproto(call, skb, "rxkad_2_datalen", "V2L",
597                                              RXKADDATALEN);
598                 goto protocol_error;
599         }
600
601         sp->len = data_size;
602         _leave(" = 0 [dlen=%x]", data_size);
603         return 0;
604
605 protocol_error:
606         if (aborted)
607                 rxrpc_send_abort_packet(call);
608         return -EPROTO;
609
610 nomem:
611         _leave(" = -ENOMEM");
612         return -ENOMEM;
613 }
614
615 /*
616  * Verify the security on a received packet and the subpackets therein.
617  */
618 static int rxkad_verify_packet(struct rxrpc_call *call, struct sk_buff *skb)
619 {
620         struct rxrpc_skb_priv *sp = rxrpc_skb(skb);
621         struct skcipher_request *req;
622         struct rxrpc_crypt iv;
623         struct scatterlist sg;
624         rxrpc_seq_t seq = sp->hdr.seq;
625         bool aborted;
626         u16 cksum;
627         u32 x, y;
628
629         _enter("{%d{%x}},{#%u}",
630                call->debug_id, key_serial(call->conn->params.key), seq);
631
632         if (!call->conn->rxkad.cipher)
633                 return 0;
634
635         req = rxkad_get_call_crypto(call);
636         if (!req)
637                 return -ENOMEM;
638
639         /* continue encrypting from where we left off */
640         memcpy(&iv, call->conn->rxkad.csum_iv.x, sizeof(iv));
641
642         /* validate the security checksum */
643         x = (call->cid & RXRPC_CHANNELMASK) << (32 - RXRPC_CIDSHIFT);
644         x |= seq & 0x3fffffff;
645         call->crypto_buf[0] = htonl(call->call_id);
646         call->crypto_buf[1] = htonl(x);
647
648         sg_init_one(&sg, call->crypto_buf, 8);
649         skcipher_request_set_sync_tfm(req, call->conn->rxkad.cipher);
650         skcipher_request_set_callback(req, 0, NULL, NULL);
651         skcipher_request_set_crypt(req, &sg, &sg, 8, iv.x);
652         crypto_skcipher_encrypt(req);
653         skcipher_request_zero(req);
654
655         y = ntohl(call->crypto_buf[1]);
656         cksum = (y >> 16) & 0xffff;
657         if (cksum == 0)
658                 cksum = 1; /* zero checksums are not permitted */
659
660         if (cksum != sp->hdr.cksum) {
661                 aborted = rxrpc_abort_eproto(call, skb, "rxkad_csum", "VCK",
662                                              RXKADSEALEDINCON);
663                 goto protocol_error;
664         }
665
666         switch (call->conn->params.security_level) {
667         case RXRPC_SECURITY_PLAIN:
668                 return 0;
669         case RXRPC_SECURITY_AUTH:
670                 return rxkad_verify_packet_1(call, skb, seq, req);
671         case RXRPC_SECURITY_ENCRYPT:
672                 return rxkad_verify_packet_2(call, skb, seq, req);
673         default:
674                 return -ENOANO;
675         }
676
677 protocol_error:
678         if (aborted)
679                 rxrpc_send_abort_packet(call);
680         return -EPROTO;
681 }
682
683 /*
684  * issue a challenge
685  */
686 static int rxkad_issue_challenge(struct rxrpc_connection *conn)
687 {
688         struct rxkad_challenge challenge;
689         struct rxrpc_wire_header whdr;
690         struct msghdr msg;
691         struct kvec iov[2];
692         size_t len;
693         u32 serial;
694         int ret;
695
696         _enter("{%d}", conn->debug_id);
697
698         get_random_bytes(&conn->rxkad.nonce, sizeof(conn->rxkad.nonce));
699
700         challenge.version       = htonl(2);
701         challenge.nonce         = htonl(conn->rxkad.nonce);
702         challenge.min_level     = htonl(0);
703         challenge.__padding     = 0;
704
705         msg.msg_name    = &conn->params.peer->srx.transport;
706         msg.msg_namelen = conn->params.peer->srx.transport_len;
707         msg.msg_control = NULL;
708         msg.msg_controllen = 0;
709         msg.msg_flags   = 0;
710
711         whdr.epoch      = htonl(conn->proto.epoch);
712         whdr.cid        = htonl(conn->proto.cid);
713         whdr.callNumber = 0;
714         whdr.seq        = 0;
715         whdr.type       = RXRPC_PACKET_TYPE_CHALLENGE;
716         whdr.flags      = conn->out_clientflag;
717         whdr.userStatus = 0;
718         whdr.securityIndex = conn->security_ix;
719         whdr._rsvd      = 0;
720         whdr.serviceId  = htons(conn->service_id);
721
722         iov[0].iov_base = &whdr;
723         iov[0].iov_len  = sizeof(whdr);
724         iov[1].iov_base = &challenge;
725         iov[1].iov_len  = sizeof(challenge);
726
727         len = iov[0].iov_len + iov[1].iov_len;
728
729         serial = atomic_inc_return(&conn->serial);
730         whdr.serial = htonl(serial);
731         _proto("Tx CHALLENGE %%%u", serial);
732
733         ret = kernel_sendmsg(conn->params.local->socket, &msg, iov, 2, len);
734         if (ret < 0) {
735                 trace_rxrpc_tx_fail(conn->debug_id, serial, ret,
736                                     rxrpc_tx_point_rxkad_challenge);
737                 return -EAGAIN;
738         }
739
740         conn->params.peer->last_tx_at = ktime_get_seconds();
741         trace_rxrpc_tx_packet(conn->debug_id, &whdr,
742                               rxrpc_tx_point_rxkad_challenge);
743         _leave(" = 0");
744         return 0;
745 }
746
747 /*
748  * send a Kerberos security response
749  */
750 static int rxkad_send_response(struct rxrpc_connection *conn,
751                                struct rxrpc_host_header *hdr,
752                                struct rxkad_response *resp,
753                                const struct rxkad_key *s2)
754 {
755         struct rxrpc_wire_header whdr;
756         struct msghdr msg;
757         struct kvec iov[3];
758         size_t len;
759         u32 serial;
760         int ret;
761
762         _enter("");
763
764         msg.msg_name    = &conn->params.peer->srx.transport;
765         msg.msg_namelen = conn->params.peer->srx.transport_len;
766         msg.msg_control = NULL;
767         msg.msg_controllen = 0;
768         msg.msg_flags   = 0;
769
770         memset(&whdr, 0, sizeof(whdr));
771         whdr.epoch      = htonl(hdr->epoch);
772         whdr.cid        = htonl(hdr->cid);
773         whdr.type       = RXRPC_PACKET_TYPE_RESPONSE;
774         whdr.flags      = conn->out_clientflag;
775         whdr.securityIndex = hdr->securityIndex;
776         whdr.serviceId  = htons(hdr->serviceId);
777
778         iov[0].iov_base = &whdr;
779         iov[0].iov_len  = sizeof(whdr);
780         iov[1].iov_base = resp;
781         iov[1].iov_len  = sizeof(*resp);
782         iov[2].iov_base = (void *)s2->ticket;
783         iov[2].iov_len  = s2->ticket_len;
784
785         len = iov[0].iov_len + iov[1].iov_len + iov[2].iov_len;
786
787         serial = atomic_inc_return(&conn->serial);
788         whdr.serial = htonl(serial);
789         _proto("Tx RESPONSE %%%u", serial);
790
791         ret = kernel_sendmsg(conn->params.local->socket, &msg, iov, 3, len);
792         if (ret < 0) {
793                 trace_rxrpc_tx_fail(conn->debug_id, serial, ret,
794                                     rxrpc_tx_point_rxkad_response);
795                 return -EAGAIN;
796         }
797
798         conn->params.peer->last_tx_at = ktime_get_seconds();
799         _leave(" = 0");
800         return 0;
801 }
802
803 /*
804  * calculate the response checksum
805  */
806 static void rxkad_calc_response_checksum(struct rxkad_response *response)
807 {
808         u32 csum = 1000003;
809         int loop;
810         u8 *p = (u8 *) response;
811
812         for (loop = sizeof(*response); loop > 0; loop--)
813                 csum = csum * 0x10204081 + *p++;
814
815         response->encrypted.checksum = htonl(csum);
816 }
817
818 /*
819  * encrypt the response packet
820  */
821 static int rxkad_encrypt_response(struct rxrpc_connection *conn,
822                                   struct rxkad_response *resp,
823                                   const struct rxkad_key *s2)
824 {
825         struct skcipher_request *req;
826         struct rxrpc_crypt iv;
827         struct scatterlist sg[1];
828
829         req = skcipher_request_alloc(&conn->rxkad.cipher->base, GFP_NOFS);
830         if (!req)
831                 return -ENOMEM;
832
833         /* continue encrypting from where we left off */
834         memcpy(&iv, s2->session_key, sizeof(iv));
835
836         sg_init_table(sg, 1);
837         sg_set_buf(sg, &resp->encrypted, sizeof(resp->encrypted));
838         skcipher_request_set_sync_tfm(req, conn->rxkad.cipher);
839         skcipher_request_set_callback(req, 0, NULL, NULL);
840         skcipher_request_set_crypt(req, sg, sg, sizeof(resp->encrypted), iv.x);
841         crypto_skcipher_encrypt(req);
842         skcipher_request_free(req);
843         return 0;
844 }
845
846 /*
847  * respond to a challenge packet
848  */
849 static int rxkad_respond_to_challenge(struct rxrpc_connection *conn,
850                                       struct sk_buff *skb,
851                                       u32 *_abort_code)
852 {
853         const struct rxrpc_key_token *token;
854         struct rxkad_challenge challenge;
855         struct rxkad_response *resp;
856         struct rxrpc_skb_priv *sp = rxrpc_skb(skb);
857         const char *eproto;
858         u32 version, nonce, min_level, abort_code;
859         int ret;
860
861         _enter("{%d,%x}", conn->debug_id, key_serial(conn->params.key));
862
863         eproto = tracepoint_string("chall_no_key");
864         abort_code = RX_PROTOCOL_ERROR;
865         if (!conn->params.key)
866                 goto protocol_error;
867
868         abort_code = RXKADEXPIRED;
869         ret = key_validate(conn->params.key);
870         if (ret < 0)
871                 goto other_error;
872
873         eproto = tracepoint_string("chall_short");
874         abort_code = RXKADPACKETSHORT;
875         if (skb_copy_bits(skb, sizeof(struct rxrpc_wire_header),
876                           &challenge, sizeof(challenge)) < 0)
877                 goto protocol_error;
878
879         version = ntohl(challenge.version);
880         nonce = ntohl(challenge.nonce);
881         min_level = ntohl(challenge.min_level);
882
883         _proto("Rx CHALLENGE %%%u { v=%u n=%u ml=%u }",
884                sp->hdr.serial, version, nonce, min_level);
885
886         eproto = tracepoint_string("chall_ver");
887         abort_code = RXKADINCONSISTENCY;
888         if (version != RXKAD_VERSION)
889                 goto protocol_error;
890
891         abort_code = RXKADLEVELFAIL;
892         ret = -EACCES;
893         if (conn->params.security_level < min_level)
894                 goto other_error;
895
896         token = conn->params.key->payload.data[0];
897
898         /* build the response packet */
899         resp = kzalloc(sizeof(struct rxkad_response), GFP_NOFS);
900         if (!resp)
901                 return -ENOMEM;
902
903         resp->version                   = htonl(RXKAD_VERSION);
904         resp->encrypted.epoch           = htonl(conn->proto.epoch);
905         resp->encrypted.cid             = htonl(conn->proto.cid);
906         resp->encrypted.securityIndex   = htonl(conn->security_ix);
907         resp->encrypted.inc_nonce       = htonl(nonce + 1);
908         resp->encrypted.level           = htonl(conn->params.security_level);
909         resp->kvno                      = htonl(token->kad->kvno);
910         resp->ticket_len                = htonl(token->kad->ticket_len);
911         resp->encrypted.call_id[0]      = htonl(conn->channels[0].call_counter);
912         resp->encrypted.call_id[1]      = htonl(conn->channels[1].call_counter);
913         resp->encrypted.call_id[2]      = htonl(conn->channels[2].call_counter);
914         resp->encrypted.call_id[3]      = htonl(conn->channels[3].call_counter);
915
916         /* calculate the response checksum and then do the encryption */
917         rxkad_calc_response_checksum(resp);
918         ret = rxkad_encrypt_response(conn, resp, token->kad);
919         if (ret == 0)
920                 ret = rxkad_send_response(conn, &sp->hdr, resp, token->kad);
921         kfree(resp);
922         return ret;
923
924 protocol_error:
925         trace_rxrpc_rx_eproto(NULL, sp->hdr.serial, eproto);
926         ret = -EPROTO;
927 other_error:
928         *_abort_code = abort_code;
929         return ret;
930 }
931
932 /*
933  * decrypt the kerberos IV ticket in the response
934  */
935 static int rxkad_decrypt_ticket(struct rxrpc_connection *conn,
936                                 struct key *server_key,
937                                 struct sk_buff *skb,
938                                 void *ticket, size_t ticket_len,
939                                 struct rxrpc_crypt *_session_key,
940                                 time64_t *_expiry,
941                                 u32 *_abort_code)
942 {
943         struct skcipher_request *req;
944         struct rxrpc_skb_priv *sp = rxrpc_skb(skb);
945         struct rxrpc_crypt iv, key;
946         struct scatterlist sg[1];
947         struct in_addr addr;
948         unsigned int life;
949         const char *eproto;
950         time64_t issue, now;
951         bool little_endian;
952         int ret;
953         u32 abort_code;
954         u8 *p, *q, *name, *end;
955
956         _enter("{%d},{%x}", conn->debug_id, key_serial(server_key));
957
958         *_expiry = 0;
959
960         ASSERT(server_key->payload.data[0] != NULL);
961         ASSERTCMP((unsigned long) ticket & 7UL, ==, 0);
962
963         memcpy(&iv, &server_key->payload.data[2], sizeof(iv));
964
965         ret = -ENOMEM;
966         req = skcipher_request_alloc(server_key->payload.data[0], GFP_NOFS);
967         if (!req)
968                 goto temporary_error;
969
970         sg_init_one(&sg[0], ticket, ticket_len);
971         skcipher_request_set_callback(req, 0, NULL, NULL);
972         skcipher_request_set_crypt(req, sg, sg, ticket_len, iv.x);
973         crypto_skcipher_decrypt(req);
974         skcipher_request_free(req);
975
976         p = ticket;
977         end = p + ticket_len;
978
979 #define Z(field)                                        \
980         ({                                              \
981                 u8 *__str = p;                          \
982                 eproto = tracepoint_string("rxkad_bad_"#field); \
983                 q = memchr(p, 0, end - p);              \
984                 if (!q || q - p > (field##_SZ))         \
985                         goto bad_ticket;                \
986                 for (; p < q; p++)                      \
987                         if (!isprint(*p))               \
988                                 goto bad_ticket;        \
989                 p++;                                    \
990                 __str;                                  \
991         })
992
993         /* extract the ticket flags */
994         _debug("KIV FLAGS: %x", *p);
995         little_endian = *p & 1;
996         p++;
997
998         /* extract the authentication name */
999         name = Z(ANAME);
1000         _debug("KIV ANAME: %s", name);
1001
1002         /* extract the principal's instance */
1003         name = Z(INST);
1004         _debug("KIV INST : %s", name);
1005
1006         /* extract the principal's authentication domain */
1007         name = Z(REALM);
1008         _debug("KIV REALM: %s", name);
1009
1010         eproto = tracepoint_string("rxkad_bad_len");
1011         if (end - p < 4 + 8 + 4 + 2)
1012                 goto bad_ticket;
1013
1014         /* get the IPv4 address of the entity that requested the ticket */
1015         memcpy(&addr, p, sizeof(addr));
1016         p += 4;
1017         _debug("KIV ADDR : %pI4", &addr);
1018
1019         /* get the session key from the ticket */
1020         memcpy(&key, p, sizeof(key));
1021         p += 8;
1022         _debug("KIV KEY  : %08x %08x", ntohl(key.n[0]), ntohl(key.n[1]));
1023         memcpy(_session_key, &key, sizeof(key));
1024
1025         /* get the ticket's lifetime */
1026         life = *p++ * 5 * 60;
1027         _debug("KIV LIFE : %u", life);
1028
1029         /* get the issue time of the ticket */
1030         if (little_endian) {
1031                 __le32 stamp;
1032                 memcpy(&stamp, p, 4);
1033                 issue = rxrpc_u32_to_time64(le32_to_cpu(stamp));
1034         } else {
1035                 __be32 stamp;
1036                 memcpy(&stamp, p, 4);
1037                 issue = rxrpc_u32_to_time64(be32_to_cpu(stamp));
1038         }
1039         p += 4;
1040         now = ktime_get_real_seconds();
1041         _debug("KIV ISSUE: %llx [%llx]", issue, now);
1042
1043         /* check the ticket is in date */
1044         if (issue > now) {
1045                 abort_code = RXKADNOAUTH;
1046                 ret = -EKEYREJECTED;
1047                 goto other_error;
1048         }
1049
1050         if (issue < now - life) {
1051                 abort_code = RXKADEXPIRED;
1052                 ret = -EKEYEXPIRED;
1053                 goto other_error;
1054         }
1055
1056         *_expiry = issue + life;
1057
1058         /* get the service name */
1059         name = Z(SNAME);
1060         _debug("KIV SNAME: %s", name);
1061
1062         /* get the service instance name */
1063         name = Z(INST);
1064         _debug("KIV SINST: %s", name);
1065         return 0;
1066
1067 bad_ticket:
1068         trace_rxrpc_rx_eproto(NULL, sp->hdr.serial, eproto);
1069         abort_code = RXKADBADTICKET;
1070         ret = -EPROTO;
1071 other_error:
1072         *_abort_code = abort_code;
1073         return ret;
1074 temporary_error:
1075         return ret;
1076 }
1077
1078 /*
1079  * decrypt the response packet
1080  */
1081 static void rxkad_decrypt_response(struct rxrpc_connection *conn,
1082                                    struct rxkad_response *resp,
1083                                    const struct rxrpc_crypt *session_key)
1084 {
1085         struct skcipher_request *req = rxkad_ci_req;
1086         struct scatterlist sg[1];
1087         struct rxrpc_crypt iv;
1088
1089         _enter(",,%08x%08x",
1090                ntohl(session_key->n[0]), ntohl(session_key->n[1]));
1091
1092         mutex_lock(&rxkad_ci_mutex);
1093         if (crypto_sync_skcipher_setkey(rxkad_ci, session_key->x,
1094                                         sizeof(*session_key)) < 0)
1095                 BUG();
1096
1097         memcpy(&iv, session_key, sizeof(iv));
1098
1099         sg_init_table(sg, 1);
1100         sg_set_buf(sg, &resp->encrypted, sizeof(resp->encrypted));
1101         skcipher_request_set_sync_tfm(req, rxkad_ci);
1102         skcipher_request_set_callback(req, 0, NULL, NULL);
1103         skcipher_request_set_crypt(req, sg, sg, sizeof(resp->encrypted), iv.x);
1104         crypto_skcipher_decrypt(req);
1105         skcipher_request_zero(req);
1106
1107         mutex_unlock(&rxkad_ci_mutex);
1108
1109         _leave("");
1110 }
1111
1112 /*
1113  * verify a response
1114  */
1115 static int rxkad_verify_response(struct rxrpc_connection *conn,
1116                                  struct sk_buff *skb,
1117                                  u32 *_abort_code)
1118 {
1119         struct rxkad_response *response;
1120         struct rxrpc_skb_priv *sp = rxrpc_skb(skb);
1121         struct rxrpc_crypt session_key;
1122         struct key *server_key;
1123         const char *eproto;
1124         time64_t expiry;
1125         void *ticket;
1126         u32 abort_code, version, kvno, ticket_len, level;
1127         __be32 csum;
1128         int ret, i;
1129
1130         _enter("{%d}", conn->debug_id);
1131
1132         server_key = rxrpc_look_up_server_security(conn, skb, 0, 0);
1133         if (IS_ERR(server_key)) {
1134                 switch (PTR_ERR(server_key)) {
1135                 case -ENOKEY:
1136                         abort_code = RXKADUNKNOWNKEY;
1137                         break;
1138                 case -EKEYEXPIRED:
1139                         abort_code = RXKADEXPIRED;
1140                         break;
1141                 default:
1142                         abort_code = RXKADNOAUTH;
1143                         break;
1144                 }
1145                 trace_rxrpc_abort(0, "SVK",
1146                                   sp->hdr.cid, sp->hdr.callNumber, sp->hdr.seq,
1147                                   abort_code, PTR_ERR(server_key));
1148                 *_abort_code = abort_code;
1149                 return -EPROTO;
1150         }
1151
1152         ret = -ENOMEM;
1153         response = kzalloc(sizeof(struct rxkad_response), GFP_NOFS);
1154         if (!response)
1155                 goto temporary_error;
1156
1157         eproto = tracepoint_string("rxkad_rsp_short");
1158         abort_code = RXKADPACKETSHORT;
1159         if (skb_copy_bits(skb, sizeof(struct rxrpc_wire_header),
1160                           response, sizeof(*response)) < 0)
1161                 goto protocol_error;
1162
1163         version = ntohl(response->version);
1164         ticket_len = ntohl(response->ticket_len);
1165         kvno = ntohl(response->kvno);
1166         _proto("Rx RESPONSE %%%u { v=%u kv=%u tl=%u }",
1167                sp->hdr.serial, version, kvno, ticket_len);
1168
1169         eproto = tracepoint_string("rxkad_rsp_ver");
1170         abort_code = RXKADINCONSISTENCY;
1171         if (version != RXKAD_VERSION)
1172                 goto protocol_error;
1173
1174         eproto = tracepoint_string("rxkad_rsp_tktlen");
1175         abort_code = RXKADTICKETLEN;
1176         if (ticket_len < 4 || ticket_len > MAXKRB5TICKETLEN)
1177                 goto protocol_error;
1178
1179         eproto = tracepoint_string("rxkad_rsp_unkkey");
1180         abort_code = RXKADUNKNOWNKEY;
1181         if (kvno >= RXKAD_TKT_TYPE_KERBEROS_V5)
1182                 goto protocol_error;
1183
1184         /* extract the kerberos ticket and decrypt and decode it */
1185         ret = -ENOMEM;
1186         ticket = kmalloc(ticket_len, GFP_NOFS);
1187         if (!ticket)
1188                 goto temporary_error_free_resp;
1189
1190         eproto = tracepoint_string("rxkad_tkt_short");
1191         abort_code = RXKADPACKETSHORT;
1192         if (skb_copy_bits(skb, sizeof(struct rxrpc_wire_header) + sizeof(*response),
1193                           ticket, ticket_len) < 0)
1194                 goto protocol_error_free;
1195
1196         ret = rxkad_decrypt_ticket(conn, server_key, skb, ticket, ticket_len,
1197                                    &session_key, &expiry, _abort_code);
1198         if (ret < 0)
1199                 goto temporary_error_free_ticket;
1200
1201         /* use the session key from inside the ticket to decrypt the
1202          * response */
1203         rxkad_decrypt_response(conn, response, &session_key);
1204
1205         eproto = tracepoint_string("rxkad_rsp_param");
1206         abort_code = RXKADSEALEDINCON;
1207         if (ntohl(response->encrypted.epoch) != conn->proto.epoch)
1208                 goto protocol_error_free;
1209         if (ntohl(response->encrypted.cid) != conn->proto.cid)
1210                 goto protocol_error_free;
1211         if (ntohl(response->encrypted.securityIndex) != conn->security_ix)
1212                 goto protocol_error_free;
1213         csum = response->encrypted.checksum;
1214         response->encrypted.checksum = 0;
1215         rxkad_calc_response_checksum(response);
1216         eproto = tracepoint_string("rxkad_rsp_csum");
1217         if (response->encrypted.checksum != csum)
1218                 goto protocol_error_free;
1219
1220         spin_lock(&conn->bundle->channel_lock);
1221         for (i = 0; i < RXRPC_MAXCALLS; i++) {
1222                 struct rxrpc_call *call;
1223                 u32 call_id = ntohl(response->encrypted.call_id[i]);
1224
1225                 eproto = tracepoint_string("rxkad_rsp_callid");
1226                 if (call_id > INT_MAX)
1227                         goto protocol_error_unlock;
1228
1229                 eproto = tracepoint_string("rxkad_rsp_callctr");
1230                 if (call_id < conn->channels[i].call_counter)
1231                         goto protocol_error_unlock;
1232
1233                 eproto = tracepoint_string("rxkad_rsp_callst");
1234                 if (call_id > conn->channels[i].call_counter) {
1235                         call = rcu_dereference_protected(
1236                                 conn->channels[i].call,
1237                                 lockdep_is_held(&conn->bundle->channel_lock));
1238                         if (call && call->state < RXRPC_CALL_COMPLETE)
1239                                 goto protocol_error_unlock;
1240                         conn->channels[i].call_counter = call_id;
1241                 }
1242         }
1243         spin_unlock(&conn->bundle->channel_lock);
1244
1245         eproto = tracepoint_string("rxkad_rsp_seq");
1246         abort_code = RXKADOUTOFSEQUENCE;
1247         if (ntohl(response->encrypted.inc_nonce) != conn->rxkad.nonce + 1)
1248                 goto protocol_error_free;
1249
1250         eproto = tracepoint_string("rxkad_rsp_level");
1251         abort_code = RXKADLEVELFAIL;
1252         level = ntohl(response->encrypted.level);
1253         if (level > RXRPC_SECURITY_ENCRYPT)
1254                 goto protocol_error_free;
1255         conn->params.security_level = level;
1256
1257         /* create a key to hold the security data and expiration time - after
1258          * this the connection security can be handled in exactly the same way
1259          * as for a client connection */
1260         ret = rxrpc_get_server_data_key(conn, &session_key, expiry, kvno);
1261         if (ret < 0)
1262                 goto temporary_error_free_ticket;
1263
1264         kfree(ticket);
1265         kfree(response);
1266         _leave(" = 0");
1267         return 0;
1268
1269 protocol_error_unlock:
1270         spin_unlock(&conn->bundle->channel_lock);
1271 protocol_error_free:
1272         kfree(ticket);
1273 protocol_error:
1274         kfree(response);
1275         trace_rxrpc_rx_eproto(NULL, sp->hdr.serial, eproto);
1276         key_put(server_key);
1277         *_abort_code = abort_code;
1278         return -EPROTO;
1279
1280 temporary_error_free_ticket:
1281         kfree(ticket);
1282 temporary_error_free_resp:
1283         kfree(response);
1284 temporary_error:
1285         /* Ignore the response packet if we got a temporary error such as
1286          * ENOMEM.  We just want to send the challenge again.  Note that we
1287          * also come out this way if the ticket decryption fails.
1288          */
1289         key_put(server_key);
1290         return ret;
1291 }
1292
1293 /*
1294  * clear the connection security
1295  */
1296 static void rxkad_clear(struct rxrpc_connection *conn)
1297 {
1298         _enter("");
1299
1300         if (conn->rxkad.cipher)
1301                 crypto_free_sync_skcipher(conn->rxkad.cipher);
1302 }
1303
1304 /*
1305  * Initialise the rxkad security service.
1306  */
1307 static int rxkad_init(void)
1308 {
1309         struct crypto_sync_skcipher *tfm;
1310         struct skcipher_request *req;
1311
1312         /* pin the cipher we need so that the crypto layer doesn't invoke
1313          * keventd to go get it */
1314         tfm = crypto_alloc_sync_skcipher("pcbc(fcrypt)", 0, 0);
1315         if (IS_ERR(tfm))
1316                 return PTR_ERR(tfm);
1317
1318         req = skcipher_request_alloc(&tfm->base, GFP_KERNEL);
1319         if (!req)
1320                 goto nomem_tfm;
1321
1322         rxkad_ci_req = req;
1323         rxkad_ci = tfm;
1324         return 0;
1325
1326 nomem_tfm:
1327         crypto_free_sync_skcipher(tfm);
1328         return -ENOMEM;
1329 }
1330
1331 /*
1332  * Clean up the rxkad security service.
1333  */
1334 static void rxkad_exit(void)
1335 {
1336         crypto_free_sync_skcipher(rxkad_ci);
1337         skcipher_request_free(rxkad_ci_req);
1338 }
1339
1340 /*
1341  * RxRPC Kerberos-based security
1342  */
1343 const struct rxrpc_security rxkad = {
1344         .name                           = "rxkad",
1345         .security_index                 = RXRPC_SECURITY_RXKAD,
1346         .no_key_abort                   = RXKADUNKNOWNKEY,
1347         .init                           = rxkad_init,
1348         .exit                           = rxkad_exit,
1349         .preparse_server_key            = rxkad_preparse_server_key,
1350         .free_preparse_server_key       = rxkad_free_preparse_server_key,
1351         .destroy_server_key             = rxkad_destroy_server_key,
1352         .init_connection_security       = rxkad_init_connection_security,
1353         .how_much_data                  = rxkad_how_much_data,
1354         .secure_packet                  = rxkad_secure_packet,
1355         .verify_packet                  = rxkad_verify_packet,
1356         .free_call_crypto               = rxkad_free_call_crypto,
1357         .issue_challenge                = rxkad_issue_challenge,
1358         .respond_to_challenge           = rxkad_respond_to_challenge,
1359         .verify_response                = rxkad_verify_response,
1360         .clear                          = rxkad_clear,
1361 };