~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/net/rxrpc/rxkad.c

Version: ~ [ linux-6.11.5 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.58 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.114 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.169 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.228 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.284 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.322 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  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->key));
107 
108         conn->security_ix = token->security_index;
109 
110         ci = crypto_alloc_sync_skcipher("pcbc(fcrypt)", 0, 0);
111         if (IS_ERR(ci)) {
112                 _debug("no cipher");
113                 ret = PTR_ERR(ci);
114                 goto error;
115         }
116 
117         if (crypto_sync_skcipher_setkey(ci, token->kad->session_key,
118                                    sizeof(token->kad->session_key)) < 0)
119                 BUG();
120 
121         switch (conn->security_level) {
122         case RXRPC_SECURITY_PLAIN:
123         case RXRPC_SECURITY_AUTH:
124         case RXRPC_SECURITY_ENCRYPT:
125                 break;
126         default:
127                 ret = -EKEYREJECTED;
128                 goto error;
129         }
130 
131         ret = rxkad_prime_packet_security(conn, ci);
132         if (ret < 0)
133                 goto error_ci;
134 
135         conn->rxkad.cipher = ci;
136         return 0;
137 
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 struct rxrpc_txbuf *rxkad_alloc_txbuf(struct rxrpc_call *call, size_t remain, gfp_t gfp)
149 {
150         struct rxrpc_txbuf *txb;
151         size_t shdr, space;
152 
153         remain = min(remain, 65535 - sizeof(struct rxrpc_wire_header));
154 
155         switch (call->conn->security_level) {
156         default:
157                 space = min_t(size_t, remain, RXRPC_JUMBO_DATALEN);
158                 return rxrpc_alloc_data_txbuf(call, space, 1, gfp);
159         case RXRPC_SECURITY_AUTH:
160                 shdr = sizeof(struct rxkad_level1_hdr);
161                 break;
162         case RXRPC_SECURITY_ENCRYPT:
163                 shdr = sizeof(struct rxkad_level2_hdr);
164                 break;
165         }
166 
167         space = min_t(size_t, round_down(RXRPC_JUMBO_DATALEN, RXKAD_ALIGN), remain + shdr);
168         space = round_up(space, RXKAD_ALIGN);
169 
170         txb = rxrpc_alloc_data_txbuf(call, space, RXKAD_ALIGN, gfp);
171         if (!txb)
172                 return NULL;
173 
174         txb->offset += shdr;
175         txb->space -= shdr;
176         return txb;
177 }
178 
179 /*
180  * prime the encryption state with the invariant parts of a connection's
181  * description
182  */
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->key)
196                 return 0;
197 
198         tmpbuf = kmalloc(tmpsize, GFP_KERNEL);
199         if (!tmpbuf)
200                 return -ENOMEM;
201 
202         req = skcipher_request_alloc(&ci->base, GFP_NOFS);
203         if (!req) {
204                 kfree(tmpbuf);
205                 return -ENOMEM;
206         }
207 
208         token = conn->key->payload.data[0];
209         memcpy(&iv, token->kad->session_key, sizeof(iv));
210 
211         tmpbuf[0] = htonl(conn->proto.epoch);
212         tmpbuf[1] = htonl(conn->proto.cid);
213         tmpbuf[2] = 0;
214         tmpbuf[3] = htonl(conn->security_ix);
215 
216         sg_init_one(&sg, tmpbuf, tmpsize);
217         skcipher_request_set_sync_tfm(req, ci);
218         skcipher_request_set_callback(req, 0, NULL, NULL);
219         skcipher_request_set_crypt(req, &sg, &sg, tmpsize, iv.x);
220         crypto_skcipher_encrypt(req);
221         skcipher_request_free(req);
222 
223         memcpy(&conn->rxkad.csum_iv, tmpbuf + 2, sizeof(conn->rxkad.csum_iv));
224         kfree(tmpbuf);
225         _leave(" = 0");
226         return 0;
227 }
228 
229 /*
230  * Allocate and prepare the crypto request on a call.  For any particular call,
231  * this is called serially for the packets, so no lock should be necessary.
232  */
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 
237         return skcipher_request_alloc(tfm, GFP_NOFS);
238 }
239 
240 /*
241  * Clean up the crypto on a call.
242  */
243 static void rxkad_free_call_crypto(struct rxrpc_call *call)
244 {
245 }
246 
247 /*
248  * partially encrypt a packet (level 1 security)
249  */
250 static int rxkad_secure_packet_auth(const struct rxrpc_call *call,
251                                     struct rxrpc_txbuf *txb,
252                                     struct skcipher_request *req)
253 {
254         struct rxrpc_wire_header *whdr = txb->kvec[0].iov_base;
255         struct rxkad_level1_hdr *hdr = (void *)(whdr + 1);
256         struct rxrpc_crypt iv;
257         struct scatterlist sg;
258         size_t pad;
259         u16 check;
260 
261         _enter("");
262 
263         check = txb->seq ^ call->call_id;
264         hdr->data_size = htonl((u32)check << 16 | txb->len);
265 
266         txb->len += sizeof(struct rxkad_level1_hdr);
267         pad = txb->len;
268         pad = RXKAD_ALIGN - pad;
269         pad &= RXKAD_ALIGN - 1;
270         if (pad) {
271                 memset(txb->kvec[0].iov_base + txb->offset, 0, pad);
272                 txb->len += pad;
273         }
274 
275         /* start the encryption afresh */
276         memset(&iv, 0, sizeof(iv));
277 
278         sg_init_one(&sg, hdr, 8);
279         skcipher_request_set_sync_tfm(req, call->conn->rxkad.cipher);
280         skcipher_request_set_callback(req, 0, NULL, NULL);
281         skcipher_request_set_crypt(req, &sg, &sg, 8, iv.x);
282         crypto_skcipher_encrypt(req);
283         skcipher_request_zero(req);
284 
285         _leave(" = 0");
286         return 0;
287 }
288 
289 /*
290  * wholly encrypt a packet (level 2 security)
291  */
292 static int rxkad_secure_packet_encrypt(const struct rxrpc_call *call,
293                                        struct rxrpc_txbuf *txb,
294                                        struct skcipher_request *req)
295 {
296         const struct rxrpc_key_token *token;
297         struct rxrpc_wire_header *whdr = txb->kvec[0].iov_base;
298         struct rxkad_level2_hdr *rxkhdr = (void *)(whdr + 1);
299         struct rxrpc_crypt iv;
300         struct scatterlist sg;
301         size_t pad;
302         u16 check;
303         int ret;
304 
305         _enter("");
306 
307         check = txb->seq ^ call->call_id;
308 
309         rxkhdr->data_size = htonl(txb->len | (u32)check << 16);
310         rxkhdr->checksum = 0;
311 
312         txb->len += sizeof(struct rxkad_level2_hdr);
313         pad = txb->len;
314         pad = RXKAD_ALIGN - pad;
315         pad &= RXKAD_ALIGN - 1;
316         if (pad) {
317                 memset(txb->kvec[0].iov_base + txb->offset, 0, pad);
318                 txb->len += pad;
319         }
320 
321         /* encrypt from the session key */
322         token = call->conn->key->payload.data[0];
323         memcpy(&iv, token->kad->session_key, sizeof(iv));
324 
325         sg_init_one(&sg, rxkhdr, txb->len);
326         skcipher_request_set_sync_tfm(req, call->conn->rxkad.cipher);
327         skcipher_request_set_callback(req, 0, NULL, NULL);
328         skcipher_request_set_crypt(req, &sg, &sg, txb->len, iv.x);
329         ret = crypto_skcipher_encrypt(req);
330         skcipher_request_zero(req);
331         return ret;
332 }
333 
334 /*
335  * checksum an RxRPC packet header
336  */
337 static int rxkad_secure_packet(struct rxrpc_call *call, struct rxrpc_txbuf *txb)
338 {
339         struct skcipher_request *req;
340         struct rxrpc_crypt iv;
341         struct scatterlist sg;
342         union {
343                 __be32 buf[2];
344         } crypto __aligned(8);
345         u32 x, y;
346         int ret;
347 
348         _enter("{%d{%x}},{#%u},%u,",
349                call->debug_id, key_serial(call->conn->key),
350                txb->seq, txb->len);
351 
352         if (!call->conn->rxkad.cipher)
353                 return 0;
354 
355         ret = key_validate(call->conn->key);
356         if (ret < 0)
357                 return ret;
358 
359         req = rxkad_get_call_crypto(call);
360         if (!req)
361                 return -ENOMEM;
362 
363         /* continue encrypting from where we left off */
364         memcpy(&iv, call->conn->rxkad.csum_iv.x, sizeof(iv));
365 
366         /* calculate the security checksum */
367         x = (call->cid & RXRPC_CHANNELMASK) << (32 - RXRPC_CIDSHIFT);
368         x |= txb->seq & 0x3fffffff;
369         crypto.buf[0] = htonl(call->call_id);
370         crypto.buf[1] = htonl(x);
371 
372         sg_init_one(&sg, crypto.buf, 8);
373         skcipher_request_set_sync_tfm(req, call->conn->rxkad.cipher);
374         skcipher_request_set_callback(req, 0, NULL, NULL);
375         skcipher_request_set_crypt(req, &sg, &sg, 8, iv.x);
376         crypto_skcipher_encrypt(req);
377         skcipher_request_zero(req);
378 
379         y = ntohl(crypto.buf[1]);
380         y = (y >> 16) & 0xffff;
381         if (y == 0)
382                 y = 1; /* zero checksums are not permitted */
383         txb->cksum = htons(y);
384 
385         switch (call->conn->security_level) {
386         case RXRPC_SECURITY_PLAIN:
387                 ret = 0;
388                 break;
389         case RXRPC_SECURITY_AUTH:
390                 ret = rxkad_secure_packet_auth(call, txb, req);
391                 break;
392         case RXRPC_SECURITY_ENCRYPT:
393                 ret = rxkad_secure_packet_encrypt(call, txb, req);
394                 break;
395         default:
396                 ret = -EPERM;
397                 break;
398         }
399 
400         skcipher_request_free(req);
401         _leave(" = %d [set %x]", ret, y);
402         return ret;
403 }
404 
405 /*
406  * decrypt partial encryption on a packet (level 1 security)
407  */
408 static int rxkad_verify_packet_1(struct rxrpc_call *call, struct sk_buff *skb,
409                                  rxrpc_seq_t seq,
410                                  struct skcipher_request *req)
411 {
412         struct rxkad_level1_hdr sechdr;
413         struct rxrpc_skb_priv *sp = rxrpc_skb(skb);
414         struct rxrpc_crypt iv;
415         struct scatterlist sg[16];
416         u32 data_size, buf;
417         u16 check;
418         int ret;
419 
420         _enter("");
421 
422         if (sp->len < 8)
423                 return rxrpc_abort_eproto(call, skb, RXKADSEALEDINCON,
424                                           rxkad_abort_1_short_header);
425 
426         /* Decrypt the skbuff in-place.  TODO: We really want to decrypt
427          * directly into the target buffer.
428          */
429         sg_init_table(sg, ARRAY_SIZE(sg));
430         ret = skb_to_sgvec(skb, sg, sp->offset, 8);
431         if (unlikely(ret < 0))
432                 return ret;
433 
434         /* start the decryption afresh */
435         memset(&iv, 0, sizeof(iv));
436 
437         skcipher_request_set_sync_tfm(req, call->conn->rxkad.cipher);
438         skcipher_request_set_callback(req, 0, NULL, NULL);
439         skcipher_request_set_crypt(req, sg, sg, 8, iv.x);
440         crypto_skcipher_decrypt(req);
441         skcipher_request_zero(req);
442 
443         /* Extract the decrypted packet length */
444         if (skb_copy_bits(skb, sp->offset, &sechdr, sizeof(sechdr)) < 0)
445                 return rxrpc_abort_eproto(call, skb, RXKADDATALEN,
446                                           rxkad_abort_1_short_encdata);
447         sp->offset += sizeof(sechdr);
448         sp->len    -= sizeof(sechdr);
449 
450         buf = ntohl(sechdr.data_size);
451         data_size = buf & 0xffff;
452 
453         check = buf >> 16;
454         check ^= seq ^ call->call_id;
455         check &= 0xffff;
456         if (check != 0)
457                 return rxrpc_abort_eproto(call, skb, RXKADSEALEDINCON,
458                                           rxkad_abort_1_short_check);
459         if (data_size > sp->len)
460                 return rxrpc_abort_eproto(call, skb, RXKADDATALEN,
461                                           rxkad_abort_1_short_data);
462         sp->len = data_size;
463 
464         _leave(" = 0 [dlen=%x]", data_size);
465         return 0;
466 }
467 
468 /*
469  * wholly decrypt a packet (level 2 security)
470  */
471 static int rxkad_verify_packet_2(struct rxrpc_call *call, struct sk_buff *skb,
472                                  rxrpc_seq_t seq,
473                                  struct skcipher_request *req)
474 {
475         const struct rxrpc_key_token *token;
476         struct rxkad_level2_hdr sechdr;
477         struct rxrpc_skb_priv *sp = rxrpc_skb(skb);
478         struct rxrpc_crypt iv;
479         struct scatterlist _sg[4], *sg;
480         u32 data_size, buf;
481         u16 check;
482         int nsg, ret;
483 
484         _enter(",{%d}", sp->len);
485 
486         if (sp->len < 8)
487                 return rxrpc_abort_eproto(call, skb, RXKADSEALEDINCON,
488                                           rxkad_abort_2_short_header);
489 
490         /* Decrypt the skbuff in-place.  TODO: We really want to decrypt
491          * directly into the target buffer.
492          */
493         sg = _sg;
494         nsg = skb_shinfo(skb)->nr_frags + 1;
495         if (nsg <= 4) {
496                 nsg = 4;
497         } else {
498                 sg = kmalloc_array(nsg, sizeof(*sg), GFP_NOIO);
499                 if (!sg)
500                         return -ENOMEM;
501         }
502 
503         sg_init_table(sg, nsg);
504         ret = skb_to_sgvec(skb, sg, sp->offset, sp->len);
505         if (unlikely(ret < 0)) {
506                 if (sg != _sg)
507                         kfree(sg);
508                 return ret;
509         }
510 
511         /* decrypt from the session key */
512         token = call->conn->key->payload.data[0];
513         memcpy(&iv, token->kad->session_key, sizeof(iv));
514 
515         skcipher_request_set_sync_tfm(req, call->conn->rxkad.cipher);
516         skcipher_request_set_callback(req, 0, NULL, NULL);
517         skcipher_request_set_crypt(req, sg, sg, sp->len, iv.x);
518         crypto_skcipher_decrypt(req);
519         skcipher_request_zero(req);
520         if (sg != _sg)
521                 kfree(sg);
522 
523         /* Extract the decrypted packet length */
524         if (skb_copy_bits(skb, sp->offset, &sechdr, sizeof(sechdr)) < 0)
525                 return rxrpc_abort_eproto(call, skb, RXKADDATALEN,
526                                           rxkad_abort_2_short_len);
527         sp->offset += sizeof(sechdr);
528         sp->len    -= sizeof(sechdr);
529 
530         buf = ntohl(sechdr.data_size);
531         data_size = buf & 0xffff;
532 
533         check = buf >> 16;
534         check ^= seq ^ call->call_id;
535         check &= 0xffff;
536         if (check != 0)
537                 return rxrpc_abort_eproto(call, skb, RXKADSEALEDINCON,
538                                           rxkad_abort_2_short_check);
539 
540         if (data_size > sp->len)
541                 return rxrpc_abort_eproto(call, skb, RXKADDATALEN,
542                                           rxkad_abort_2_short_data);
543 
544         sp->len = data_size;
545         _leave(" = 0 [dlen=%x]", data_size);
546         return 0;
547 }
548 
549 /*
550  * Verify the security on a received packet and the subpackets therein.
551  */
552 static int rxkad_verify_packet(struct rxrpc_call *call, struct sk_buff *skb)
553 {
554         struct rxrpc_skb_priv *sp = rxrpc_skb(skb);
555         struct skcipher_request *req;
556         struct rxrpc_crypt iv;
557         struct scatterlist sg;
558         union {
559                 __be32 buf[2];
560         } crypto __aligned(8);
561         rxrpc_seq_t seq = sp->hdr.seq;
562         int ret;
563         u16 cksum;
564         u32 x, y;
565 
566         _enter("{%d{%x}},{#%u}",
567                call->debug_id, key_serial(call->conn->key), seq);
568 
569         if (!call->conn->rxkad.cipher)
570                 return 0;
571 
572         req = rxkad_get_call_crypto(call);
573         if (!req)
574                 return -ENOMEM;
575 
576         /* continue encrypting from where we left off */
577         memcpy(&iv, call->conn->rxkad.csum_iv.x, sizeof(iv));
578 
579         /* validate the security checksum */
580         x = (call->cid & RXRPC_CHANNELMASK) << (32 - RXRPC_CIDSHIFT);
581         x |= seq & 0x3fffffff;
582         crypto.buf[0] = htonl(call->call_id);
583         crypto.buf[1] = htonl(x);
584 
585         sg_init_one(&sg, crypto.buf, 8);
586         skcipher_request_set_sync_tfm(req, call->conn->rxkad.cipher);
587         skcipher_request_set_callback(req, 0, NULL, NULL);
588         skcipher_request_set_crypt(req, &sg, &sg, 8, iv.x);
589         crypto_skcipher_encrypt(req);
590         skcipher_request_zero(req);
591 
592         y = ntohl(crypto.buf[1]);
593         cksum = (y >> 16) & 0xffff;
594         if (cksum == 0)
595                 cksum = 1; /* zero checksums are not permitted */
596 
597         if (cksum != sp->hdr.cksum) {
598                 ret = rxrpc_abort_eproto(call, skb, RXKADSEALEDINCON,
599                                          rxkad_abort_bad_checksum);
600                 goto out;
601         }
602 
603         switch (call->conn->security_level) {
604         case RXRPC_SECURITY_PLAIN:
605                 ret = 0;
606                 break;
607         case RXRPC_SECURITY_AUTH:
608                 ret = rxkad_verify_packet_1(call, skb, seq, req);
609                 break;
610         case RXRPC_SECURITY_ENCRYPT:
611                 ret = rxkad_verify_packet_2(call, skb, seq, req);
612                 break;
613         default:
614                 ret = -ENOANO;
615                 break;
616         }
617 
618 out:
619         skcipher_request_free(req);
620         return ret;
621 }
622 
623 /*
624  * issue a challenge
625  */
626 static int rxkad_issue_challenge(struct rxrpc_connection *conn)
627 {
628         struct rxkad_challenge challenge;
629         struct rxrpc_wire_header whdr;
630         struct msghdr msg;
631         struct kvec iov[2];
632         size_t len;
633         u32 serial;
634         int ret;
635 
636         _enter("{%d}", conn->debug_id);
637 
638         get_random_bytes(&conn->rxkad.nonce, sizeof(conn->rxkad.nonce));
639 
640         challenge.version       = htonl(2);
641         challenge.nonce         = htonl(conn->rxkad.nonce);
642         challenge.min_level     = htonl(0);
643         challenge.__padding     = 0;
644 
645         msg.msg_name    = &conn->peer->srx.transport;
646         msg.msg_namelen = conn->peer->srx.transport_len;
647         msg.msg_control = NULL;
648         msg.msg_controllen = 0;
649         msg.msg_flags   = 0;
650 
651         whdr.epoch      = htonl(conn->proto.epoch);
652         whdr.cid        = htonl(conn->proto.cid);
653         whdr.callNumber = 0;
654         whdr.seq        = 0;
655         whdr.type       = RXRPC_PACKET_TYPE_CHALLENGE;
656         whdr.flags      = conn->out_clientflag;
657         whdr.userStatus = 0;
658         whdr.securityIndex = conn->security_ix;
659         whdr._rsvd      = 0;
660         whdr.serviceId  = htons(conn->service_id);
661 
662         iov[0].iov_base = &whdr;
663         iov[0].iov_len  = sizeof(whdr);
664         iov[1].iov_base = &challenge;
665         iov[1].iov_len  = sizeof(challenge);
666 
667         len = iov[0].iov_len + iov[1].iov_len;
668 
669         serial = rxrpc_get_next_serial(conn);
670         whdr.serial = htonl(serial);
671 
672         ret = kernel_sendmsg(conn->local->socket, &msg, iov, 2, len);
673         if (ret < 0) {
674                 trace_rxrpc_tx_fail(conn->debug_id, serial, ret,
675                                     rxrpc_tx_point_rxkad_challenge);
676                 return -EAGAIN;
677         }
678 
679         conn->peer->last_tx_at = ktime_get_seconds();
680         trace_rxrpc_tx_packet(conn->debug_id, &whdr,
681                               rxrpc_tx_point_rxkad_challenge);
682         _leave(" = 0");
683         return 0;
684 }
685 
686 /*
687  * send a Kerberos security response
688  */
689 static int rxkad_send_response(struct rxrpc_connection *conn,
690                                struct rxrpc_host_header *hdr,
691                                struct rxkad_response *resp,
692                                const struct rxkad_key *s2)
693 {
694         struct rxrpc_wire_header whdr;
695         struct msghdr msg;
696         struct kvec iov[3];
697         size_t len;
698         u32 serial;
699         int ret;
700 
701         _enter("");
702 
703         msg.msg_name    = &conn->peer->srx.transport;
704         msg.msg_namelen = conn->peer->srx.transport_len;
705         msg.msg_control = NULL;
706         msg.msg_controllen = 0;
707         msg.msg_flags   = 0;
708 
709         memset(&whdr, 0, sizeof(whdr));
710         whdr.epoch      = htonl(hdr->epoch);
711         whdr.cid        = htonl(hdr->cid);
712         whdr.type       = RXRPC_PACKET_TYPE_RESPONSE;
713         whdr.flags      = conn->out_clientflag;
714         whdr.securityIndex = hdr->securityIndex;
715         whdr.serviceId  = htons(hdr->serviceId);
716 
717         iov[0].iov_base = &whdr;
718         iov[0].iov_len  = sizeof(whdr);
719         iov[1].iov_base = resp;
720         iov[1].iov_len  = sizeof(*resp);
721         iov[2].iov_base = (void *)s2->ticket;
722         iov[2].iov_len  = s2->ticket_len;
723 
724         len = iov[0].iov_len + iov[1].iov_len + iov[2].iov_len;
725 
726         serial = rxrpc_get_next_serial(conn);
727         whdr.serial = htonl(serial);
728 
729         rxrpc_local_dont_fragment(conn->local, false);
730         ret = kernel_sendmsg(conn->local->socket, &msg, iov, 3, len);
731         if (ret < 0) {
732                 trace_rxrpc_tx_fail(conn->debug_id, serial, ret,
733                                     rxrpc_tx_point_rxkad_response);
734                 return -EAGAIN;
735         }
736 
737         conn->peer->last_tx_at = ktime_get_seconds();
738         _leave(" = 0");
739         return 0;
740 }
741 
742 /*
743  * calculate the response checksum
744  */
745 static void rxkad_calc_response_checksum(struct rxkad_response *response)
746 {
747         u32 csum = 1000003;
748         int loop;
749         u8 *p = (u8 *) response;
750 
751         for (loop = sizeof(*response); loop > 0; loop--)
752                 csum = csum * 0x10204081 + *p++;
753 
754         response->encrypted.checksum = htonl(csum);
755 }
756 
757 /*
758  * encrypt the response packet
759  */
760 static int rxkad_encrypt_response(struct rxrpc_connection *conn,
761                                   struct rxkad_response *resp,
762                                   const struct rxkad_key *s2)
763 {
764         struct skcipher_request *req;
765         struct rxrpc_crypt iv;
766         struct scatterlist sg[1];
767 
768         req = skcipher_request_alloc(&conn->rxkad.cipher->base, GFP_NOFS);
769         if (!req)
770                 return -ENOMEM;
771 
772         /* continue encrypting from where we left off */
773         memcpy(&iv, s2->session_key, sizeof(iv));
774 
775         sg_init_table(sg, 1);
776         sg_set_buf(sg, &resp->encrypted, sizeof(resp->encrypted));
777         skcipher_request_set_sync_tfm(req, conn->rxkad.cipher);
778         skcipher_request_set_callback(req, 0, NULL, NULL);
779         skcipher_request_set_crypt(req, sg, sg, sizeof(resp->encrypted), iv.x);
780         crypto_skcipher_encrypt(req);
781         skcipher_request_free(req);
782         return 0;
783 }
784 
785 /*
786  * respond to a challenge packet
787  */
788 static int rxkad_respond_to_challenge(struct rxrpc_connection *conn,
789                                       struct sk_buff *skb)
790 {
791         const struct rxrpc_key_token *token;
792         struct rxkad_challenge challenge;
793         struct rxkad_response *resp;
794         struct rxrpc_skb_priv *sp = rxrpc_skb(skb);
795         u32 version, nonce, min_level;
796         int ret = -EPROTO;
797 
798         _enter("{%d,%x}", conn->debug_id, key_serial(conn->key));
799 
800         if (!conn->key)
801                 return rxrpc_abort_conn(conn, skb, RX_PROTOCOL_ERROR, -EPROTO,
802                                         rxkad_abort_chall_no_key);
803 
804         ret = key_validate(conn->key);
805         if (ret < 0)
806                 return rxrpc_abort_conn(conn, skb, RXKADEXPIRED, ret,
807                                         rxkad_abort_chall_key_expired);
808 
809         if (skb_copy_bits(skb, sizeof(struct rxrpc_wire_header),
810                           &challenge, sizeof(challenge)) < 0)
811                 return rxrpc_abort_conn(conn, skb, RXKADPACKETSHORT, -EPROTO,
812                                         rxkad_abort_chall_short);
813 
814         version = ntohl(challenge.version);
815         nonce = ntohl(challenge.nonce);
816         min_level = ntohl(challenge.min_level);
817 
818         trace_rxrpc_rx_challenge(conn, sp->hdr.serial, version, nonce, min_level);
819 
820         if (version != RXKAD_VERSION)
821                 return rxrpc_abort_conn(conn, skb, RXKADINCONSISTENCY, -EPROTO,
822                                         rxkad_abort_chall_version);
823 
824         if (conn->security_level < min_level)
825                 return rxrpc_abort_conn(conn, skb, RXKADLEVELFAIL, -EACCES,
826                                         rxkad_abort_chall_level);
827 
828         token = conn->key->payload.data[0];
829 
830         /* build the response packet */
831         resp = kzalloc(sizeof(struct rxkad_response), GFP_NOFS);
832         if (!resp)
833                 return -ENOMEM;
834 
835         resp->version                   = htonl(RXKAD_VERSION);
836         resp->encrypted.epoch           = htonl(conn->proto.epoch);
837         resp->encrypted.cid             = htonl(conn->proto.cid);
838         resp->encrypted.securityIndex   = htonl(conn->security_ix);
839         resp->encrypted.inc_nonce       = htonl(nonce + 1);
840         resp->encrypted.level           = htonl(conn->security_level);
841         resp->kvno                      = htonl(token->kad->kvno);
842         resp->ticket_len                = htonl(token->kad->ticket_len);
843         resp->encrypted.call_id[0]      = htonl(conn->channels[0].call_counter);
844         resp->encrypted.call_id[1]      = htonl(conn->channels[1].call_counter);
845         resp->encrypted.call_id[2]      = htonl(conn->channels[2].call_counter);
846         resp->encrypted.call_id[3]      = htonl(conn->channels[3].call_counter);
847 
848         /* calculate the response checksum and then do the encryption */
849         rxkad_calc_response_checksum(resp);
850         ret = rxkad_encrypt_response(conn, resp, token->kad);
851         if (ret == 0)
852                 ret = rxkad_send_response(conn, &sp->hdr, resp, token->kad);
853         kfree(resp);
854         return ret;
855 }
856 
857 /*
858  * decrypt the kerberos IV ticket in the response
859  */
860 static int rxkad_decrypt_ticket(struct rxrpc_connection *conn,
861                                 struct key *server_key,
862                                 struct sk_buff *skb,
863                                 void *ticket, size_t ticket_len,
864                                 struct rxrpc_crypt *_session_key,
865                                 time64_t *_expiry)
866 {
867         struct skcipher_request *req;
868         struct rxrpc_crypt iv, key;
869         struct scatterlist sg[1];
870         struct in_addr addr;
871         unsigned int life;
872         time64_t issue, now;
873         bool little_endian;
874         u8 *p, *q, *name, *end;
875 
876         _enter("{%d},{%x}", conn->debug_id, key_serial(server_key));
877 
878         *_expiry = 0;
879 
880         ASSERT(server_key->payload.data[0] != NULL);
881         ASSERTCMP((unsigned long) ticket & 7UL, ==, 0);
882 
883         memcpy(&iv, &server_key->payload.data[2], sizeof(iv));
884 
885         req = skcipher_request_alloc(server_key->payload.data[0], GFP_NOFS);
886         if (!req)
887                 return -ENOMEM;
888 
889         sg_init_one(&sg[0], ticket, ticket_len);
890         skcipher_request_set_callback(req, 0, NULL, NULL);
891         skcipher_request_set_crypt(req, sg, sg, ticket_len, iv.x);
892         crypto_skcipher_decrypt(req);
893         skcipher_request_free(req);
894 
895         p = ticket;
896         end = p + ticket_len;
897 
898 #define Z(field, fieldl)                                                \
899         ({                                                              \
900                 u8 *__str = p;                                          \
901                 q = memchr(p, 0, end - p);                              \
902                 if (!q || q - p > field##_SZ)                           \
903                         return rxrpc_abort_conn(                        \
904                                 conn, skb, RXKADBADTICKET, -EPROTO,     \
905                                 rxkad_abort_resp_tkt_##fieldl);         \
906                 for (; p < q; p++)                                      \
907                         if (!isprint(*p))                               \
908                                 return rxrpc_abort_conn(                \
909                                         conn, skb, RXKADBADTICKET, -EPROTO, \
910                                         rxkad_abort_resp_tkt_##fieldl); \
911                 p++;                                                    \
912                 __str;                                                  \
913         })
914 
915         /* extract the ticket flags */
916         _debug("KIV FLAGS: %x", *p);
917         little_endian = *p & 1;
918         p++;
919 
920         /* extract the authentication name */
921         name = Z(ANAME, aname);
922         _debug("KIV ANAME: %s", name);
923 
924         /* extract the principal's instance */
925         name = Z(INST, inst);
926         _debug("KIV INST : %s", name);
927 
928         /* extract the principal's authentication domain */
929         name = Z(REALM, realm);
930         _debug("KIV REALM: %s", name);
931 
932         if (end - p < 4 + 8 + 4 + 2)
933                 return rxrpc_abort_conn(conn, skb, RXKADBADTICKET, -EPROTO,
934                                         rxkad_abort_resp_tkt_short);
935 
936         /* get the IPv4 address of the entity that requested the ticket */
937         memcpy(&addr, p, sizeof(addr));
938         p += 4;
939         _debug("KIV ADDR : %pI4", &addr);
940 
941         /* get the session key from the ticket */
942         memcpy(&key, p, sizeof(key));
943         p += 8;
944         _debug("KIV KEY  : %08x %08x", ntohl(key.n[0]), ntohl(key.n[1]));
945         memcpy(_session_key, &key, sizeof(key));
946 
947         /* get the ticket's lifetime */
948         life = *p++ * 5 * 60;
949         _debug("KIV LIFE : %u", life);
950 
951         /* get the issue time of the ticket */
952         if (little_endian) {
953                 __le32 stamp;
954                 memcpy(&stamp, p, 4);
955                 issue = rxrpc_u32_to_time64(le32_to_cpu(stamp));
956         } else {
957                 __be32 stamp;
958                 memcpy(&stamp, p, 4);
959                 issue = rxrpc_u32_to_time64(be32_to_cpu(stamp));
960         }
961         p += 4;
962         now = ktime_get_real_seconds();
963         _debug("KIV ISSUE: %llx [%llx]", issue, now);
964 
965         /* check the ticket is in date */
966         if (issue > now)
967                 return rxrpc_abort_conn(conn, skb, RXKADNOAUTH, -EKEYREJECTED,
968                                         rxkad_abort_resp_tkt_future);
969         if (issue < now - life)
970                 return rxrpc_abort_conn(conn, skb, RXKADEXPIRED, -EKEYEXPIRED,
971                                         rxkad_abort_resp_tkt_expired);
972 
973         *_expiry = issue + life;
974 
975         /* get the service name */
976         name = Z(SNAME, sname);
977         _debug("KIV SNAME: %s", name);
978 
979         /* get the service instance name */
980         name = Z(INST, sinst);
981         _debug("KIV SINST: %s", name);
982         return 0;
983 }
984 
985 /*
986  * decrypt the response packet
987  */
988 static void rxkad_decrypt_response(struct rxrpc_connection *conn,
989                                    struct rxkad_response *resp,
990                                    const struct rxrpc_crypt *session_key)
991 {
992         struct skcipher_request *req = rxkad_ci_req;
993         struct scatterlist sg[1];
994         struct rxrpc_crypt iv;
995 
996         _enter(",,%08x%08x",
997                ntohl(session_key->n[0]), ntohl(session_key->n[1]));
998 
999         mutex_lock(&rxkad_ci_mutex);
1000         if (crypto_sync_skcipher_setkey(rxkad_ci, session_key->x,
1001                                         sizeof(*session_key)) < 0)
1002                 BUG();
1003 
1004         memcpy(&iv, session_key, sizeof(iv));
1005 
1006         sg_init_table(sg, 1);
1007         sg_set_buf(sg, &resp->encrypted, sizeof(resp->encrypted));
1008         skcipher_request_set_sync_tfm(req, rxkad_ci);
1009         skcipher_request_set_callback(req, 0, NULL, NULL);
1010         skcipher_request_set_crypt(req, sg, sg, sizeof(resp->encrypted), iv.x);
1011         crypto_skcipher_decrypt(req);
1012         skcipher_request_zero(req);
1013 
1014         mutex_unlock(&rxkad_ci_mutex);
1015 
1016         _leave("");
1017 }
1018 
1019 /*
1020  * verify a response
1021  */
1022 static int rxkad_verify_response(struct rxrpc_connection *conn,
1023                                  struct sk_buff *skb)
1024 {
1025         struct rxkad_response *response;
1026         struct rxrpc_skb_priv *sp = rxrpc_skb(skb);
1027         struct rxrpc_crypt session_key;
1028         struct key *server_key;
1029         time64_t expiry;
1030         void *ticket;
1031         u32 version, kvno, ticket_len, level;
1032         __be32 csum;
1033         int ret, i;
1034 
1035         _enter("{%d}", conn->debug_id);
1036 
1037         server_key = rxrpc_look_up_server_security(conn, skb, 0, 0);
1038         if (IS_ERR(server_key)) {
1039                 ret = PTR_ERR(server_key);
1040                 switch (ret) {
1041                 case -ENOKEY:
1042                         return rxrpc_abort_conn(conn, skb, RXKADUNKNOWNKEY, ret,
1043                                                 rxkad_abort_resp_nokey);
1044                 case -EKEYEXPIRED:
1045                         return rxrpc_abort_conn(conn, skb, RXKADEXPIRED, ret,
1046                                                 rxkad_abort_resp_key_expired);
1047                 default:
1048                         return rxrpc_abort_conn(conn, skb, RXKADNOAUTH, ret,
1049                                                 rxkad_abort_resp_key_rejected);
1050                 }
1051         }
1052 
1053         ret = -ENOMEM;
1054         response = kzalloc(sizeof(struct rxkad_response), GFP_NOFS);
1055         if (!response)
1056                 goto temporary_error;
1057 
1058         if (skb_copy_bits(skb, sizeof(struct rxrpc_wire_header),
1059                           response, sizeof(*response)) < 0) {
1060                 rxrpc_abort_conn(conn, skb, RXKADPACKETSHORT, -EPROTO,
1061                                  rxkad_abort_resp_short);
1062                 goto protocol_error;
1063         }
1064 
1065         version = ntohl(response->version);
1066         ticket_len = ntohl(response->ticket_len);
1067         kvno = ntohl(response->kvno);
1068 
1069         trace_rxrpc_rx_response(conn, sp->hdr.serial, version, kvno, ticket_len);
1070 
1071         if (version != RXKAD_VERSION) {
1072                 rxrpc_abort_conn(conn, skb, RXKADINCONSISTENCY, -EPROTO,
1073                                  rxkad_abort_resp_version);
1074                 goto protocol_error;
1075         }
1076 
1077         if (ticket_len < 4 || ticket_len > MAXKRB5TICKETLEN) {
1078                 rxrpc_abort_conn(conn, skb, RXKADTICKETLEN, -EPROTO,
1079                                  rxkad_abort_resp_tkt_len);
1080                 goto protocol_error;
1081         }
1082 
1083         if (kvno >= RXKAD_TKT_TYPE_KERBEROS_V5) {
1084                 rxrpc_abort_conn(conn, skb, RXKADUNKNOWNKEY, -EPROTO,
1085                                  rxkad_abort_resp_unknown_tkt);
1086                 goto protocol_error;
1087         }
1088 
1089         /* extract the kerberos ticket and decrypt and decode it */
1090         ret = -ENOMEM;
1091         ticket = kmalloc(ticket_len, GFP_NOFS);
1092         if (!ticket)
1093                 goto temporary_error_free_resp;
1094 
1095         if (skb_copy_bits(skb, sizeof(struct rxrpc_wire_header) + sizeof(*response),
1096                           ticket, ticket_len) < 0) {
1097                 rxrpc_abort_conn(conn, skb, RXKADPACKETSHORT, -EPROTO,
1098                                  rxkad_abort_resp_short_tkt);
1099                 goto protocol_error;
1100         }
1101 
1102         ret = rxkad_decrypt_ticket(conn, server_key, skb, ticket, ticket_len,
1103                                    &session_key, &expiry);
1104         if (ret < 0)
1105                 goto temporary_error_free_ticket;
1106 
1107         /* use the session key from inside the ticket to decrypt the
1108          * response */
1109         rxkad_decrypt_response(conn, response, &session_key);
1110 
1111         if (ntohl(response->encrypted.epoch) != conn->proto.epoch ||
1112             ntohl(response->encrypted.cid) != conn->proto.cid ||
1113             ntohl(response->encrypted.securityIndex) != conn->security_ix) {
1114                 rxrpc_abort_conn(conn, skb, RXKADSEALEDINCON, -EPROTO,
1115                                  rxkad_abort_resp_bad_param);
1116                 goto protocol_error_free;
1117         }
1118 
1119         csum = response->encrypted.checksum;
1120         response->encrypted.checksum = 0;
1121         rxkad_calc_response_checksum(response);
1122         if (response->encrypted.checksum != csum) {
1123                 rxrpc_abort_conn(conn, skb, RXKADSEALEDINCON, -EPROTO,
1124                                  rxkad_abort_resp_bad_checksum);
1125                 goto protocol_error_free;
1126         }
1127 
1128         for (i = 0; i < RXRPC_MAXCALLS; i++) {
1129                 u32 call_id = ntohl(response->encrypted.call_id[i]);
1130                 u32 counter = READ_ONCE(conn->channels[i].call_counter);
1131 
1132                 if (call_id > INT_MAX) {
1133                         rxrpc_abort_conn(conn, skb, RXKADSEALEDINCON, -EPROTO,
1134                                          rxkad_abort_resp_bad_callid);
1135                         goto protocol_error_free;
1136                 }
1137 
1138                 if (call_id < counter) {
1139                         rxrpc_abort_conn(conn, skb, RXKADSEALEDINCON, -EPROTO,
1140                                          rxkad_abort_resp_call_ctr);
1141                         goto protocol_error_free;
1142                 }
1143 
1144                 if (call_id > counter) {
1145                         if (conn->channels[i].call) {
1146                                 rxrpc_abort_conn(conn, skb, RXKADSEALEDINCON, -EPROTO,
1147                                                  rxkad_abort_resp_call_state);
1148                                 goto protocol_error_free;
1149                         }
1150                         conn->channels[i].call_counter = call_id;
1151                 }
1152         }
1153 
1154         if (ntohl(response->encrypted.inc_nonce) != conn->rxkad.nonce + 1) {
1155                 rxrpc_abort_conn(conn, skb, RXKADOUTOFSEQUENCE, -EPROTO,
1156                                  rxkad_abort_resp_ooseq);
1157                 goto protocol_error_free;
1158         }
1159 
1160         level = ntohl(response->encrypted.level);
1161         if (level > RXRPC_SECURITY_ENCRYPT) {
1162                 rxrpc_abort_conn(conn, skb, RXKADLEVELFAIL, -EPROTO,
1163                                  rxkad_abort_resp_level);
1164                 goto protocol_error_free;
1165         }
1166         conn->security_level = level;
1167 
1168         /* create a key to hold the security data and expiration time - after
1169          * this the connection security can be handled in exactly the same way
1170          * as for a client connection */
1171         ret = rxrpc_get_server_data_key(conn, &session_key, expiry, kvno);
1172         if (ret < 0)
1173                 goto temporary_error_free_ticket;
1174 
1175         kfree(ticket);
1176         kfree(response);
1177         _leave(" = 0");
1178         return 0;
1179 
1180 protocol_error_free:
1181         kfree(ticket);
1182 protocol_error:
1183         kfree(response);
1184         key_put(server_key);
1185         return -EPROTO;
1186 
1187 temporary_error_free_ticket:
1188         kfree(ticket);
1189 temporary_error_free_resp:
1190         kfree(response);
1191 temporary_error:
1192         /* Ignore the response packet if we got a temporary error such as
1193          * ENOMEM.  We just want to send the challenge again.  Note that we
1194          * also come out this way if the ticket decryption fails.
1195          */
1196         key_put(server_key);
1197         return ret;
1198 }
1199 
1200 /*
1201  * clear the connection security
1202  */
1203 static void rxkad_clear(struct rxrpc_connection *conn)
1204 {
1205         _enter("");
1206 
1207         if (conn->rxkad.cipher)
1208                 crypto_free_sync_skcipher(conn->rxkad.cipher);
1209 }
1210 
1211 /*
1212  * Initialise the rxkad security service.
1213  */
1214 static int rxkad_init(void)
1215 {
1216         struct crypto_sync_skcipher *tfm;
1217         struct skcipher_request *req;
1218 
1219         /* pin the cipher we need so that the crypto layer doesn't invoke
1220          * keventd to go get it */
1221         tfm = crypto_alloc_sync_skcipher("pcbc(fcrypt)", 0, 0);
1222         if (IS_ERR(tfm))
1223                 return PTR_ERR(tfm);
1224 
1225         req = skcipher_request_alloc(&tfm->base, GFP_KERNEL);
1226         if (!req)
1227                 goto nomem_tfm;
1228 
1229         rxkad_ci_req = req;
1230         rxkad_ci = tfm;
1231         return 0;
1232 
1233 nomem_tfm:
1234         crypto_free_sync_skcipher(tfm);
1235         return -ENOMEM;
1236 }
1237 
1238 /*
1239  * Clean up the rxkad security service.
1240  */
1241 static void rxkad_exit(void)
1242 {
1243         crypto_free_sync_skcipher(rxkad_ci);
1244         skcipher_request_free(rxkad_ci_req);
1245 }
1246 
1247 /*
1248  * RxRPC Kerberos-based security
1249  */
1250 const struct rxrpc_security rxkad = {
1251         .name                           = "rxkad",
1252         .security_index                 = RXRPC_SECURITY_RXKAD,
1253         .no_key_abort                   = RXKADUNKNOWNKEY,
1254         .init                           = rxkad_init,
1255         .exit                           = rxkad_exit,
1256         .preparse_server_key            = rxkad_preparse_server_key,
1257         .free_preparse_server_key       = rxkad_free_preparse_server_key,
1258         .destroy_server_key             = rxkad_destroy_server_key,
1259         .init_connection_security       = rxkad_init_connection_security,
1260         .alloc_txbuf                    = rxkad_alloc_txbuf,
1261         .secure_packet                  = rxkad_secure_packet,
1262         .verify_packet                  = rxkad_verify_packet,
1263         .free_call_crypto               = rxkad_free_call_crypto,
1264         .issue_challenge                = rxkad_issue_challenge,
1265         .respond_to_challenge           = rxkad_respond_to_challenge,
1266         .verify_response                = rxkad_verify_response,
1267         .clear                          = rxkad_clear,
1268 };
1269 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php