Merge tag 'linux-kselftest-5.2-rc4' of git://git.kernel.org/pub/scm/linux/kernel...
[platform/kernel/linux-rpi.git] / net / rxrpc / key.c
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /* RxRPC key management
3  *
4  * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved.
5  * Written by David Howells (dhowells@redhat.com)
6  *
7  * RxRPC keys should have a description of describing their purpose:
8  *      "afs@CAMBRIDGE.REDHAT.COM>
9  */
10
11 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
12
13 #include <crypto/skcipher.h>
14 #include <linux/module.h>
15 #include <linux/net.h>
16 #include <linux/skbuff.h>
17 #include <linux/key-type.h>
18 #include <linux/ctype.h>
19 #include <linux/slab.h>
20 #include <net/sock.h>
21 #include <net/af_rxrpc.h>
22 #include <keys/rxrpc-type.h>
23 #include <keys/user-type.h>
24 #include "ar-internal.h"
25
26 static int rxrpc_vet_description_s(const char *);
27 static int rxrpc_preparse(struct key_preparsed_payload *);
28 static int rxrpc_preparse_s(struct key_preparsed_payload *);
29 static void rxrpc_free_preparse(struct key_preparsed_payload *);
30 static void rxrpc_free_preparse_s(struct key_preparsed_payload *);
31 static void rxrpc_destroy(struct key *);
32 static void rxrpc_destroy_s(struct key *);
33 static void rxrpc_describe(const struct key *, struct seq_file *);
34 static long rxrpc_read(const struct key *, char __user *, size_t);
35
36 /*
37  * rxrpc defined keys take an arbitrary string as the description and an
38  * arbitrary blob of data as the payload
39  */
40 struct key_type key_type_rxrpc = {
41         .name           = "rxrpc",
42         .preparse       = rxrpc_preparse,
43         .free_preparse  = rxrpc_free_preparse,
44         .instantiate    = generic_key_instantiate,
45         .destroy        = rxrpc_destroy,
46         .describe       = rxrpc_describe,
47         .read           = rxrpc_read,
48 };
49 EXPORT_SYMBOL(key_type_rxrpc);
50
51 /*
52  * rxrpc server defined keys take "<serviceId>:<securityIndex>" as the
53  * description and an 8-byte decryption key as the payload
54  */
55 struct key_type key_type_rxrpc_s = {
56         .name           = "rxrpc_s",
57         .vet_description = rxrpc_vet_description_s,
58         .preparse       = rxrpc_preparse_s,
59         .free_preparse  = rxrpc_free_preparse_s,
60         .instantiate    = generic_key_instantiate,
61         .destroy        = rxrpc_destroy_s,
62         .describe       = rxrpc_describe,
63 };
64
65 /*
66  * Vet the description for an RxRPC server key
67  */
68 static int rxrpc_vet_description_s(const char *desc)
69 {
70         unsigned long num;
71         char *p;
72
73         num = simple_strtoul(desc, &p, 10);
74         if (*p != ':' || num > 65535)
75                 return -EINVAL;
76         num = simple_strtoul(p + 1, &p, 10);
77         if (*p || num < 1 || num > 255)
78                 return -EINVAL;
79         return 0;
80 }
81
82 /*
83  * parse an RxKAD type XDR format token
84  * - the caller guarantees we have at least 4 words
85  */
86 static int rxrpc_preparse_xdr_rxkad(struct key_preparsed_payload *prep,
87                                     size_t datalen,
88                                     const __be32 *xdr, unsigned int toklen)
89 {
90         struct rxrpc_key_token *token, **pptoken;
91         time64_t expiry;
92         size_t plen;
93         u32 tktlen;
94
95         _enter(",{%x,%x,%x,%x},%u",
96                ntohl(xdr[0]), ntohl(xdr[1]), ntohl(xdr[2]), ntohl(xdr[3]),
97                toklen);
98
99         if (toklen <= 8 * 4)
100                 return -EKEYREJECTED;
101         tktlen = ntohl(xdr[7]);
102         _debug("tktlen: %x", tktlen);
103         if (tktlen > AFSTOKEN_RK_TIX_MAX)
104                 return -EKEYREJECTED;
105         if (toklen < 8 * 4 + tktlen)
106                 return -EKEYREJECTED;
107
108         plen = sizeof(*token) + sizeof(*token->kad) + tktlen;
109         prep->quotalen = datalen + plen;
110
111         plen -= sizeof(*token);
112         token = kzalloc(sizeof(*token), GFP_KERNEL);
113         if (!token)
114                 return -ENOMEM;
115
116         token->kad = kzalloc(plen, GFP_KERNEL);
117         if (!token->kad) {
118                 kfree(token);
119                 return -ENOMEM;
120         }
121
122         token->security_index   = RXRPC_SECURITY_RXKAD;
123         token->kad->ticket_len  = tktlen;
124         token->kad->vice_id     = ntohl(xdr[0]);
125         token->kad->kvno        = ntohl(xdr[1]);
126         token->kad->start       = ntohl(xdr[4]);
127         token->kad->expiry      = ntohl(xdr[5]);
128         token->kad->primary_flag = ntohl(xdr[6]);
129         memcpy(&token->kad->session_key, &xdr[2], 8);
130         memcpy(&token->kad->ticket, &xdr[8], tktlen);
131
132         _debug("SCIX: %u", token->security_index);
133         _debug("TLEN: %u", token->kad->ticket_len);
134         _debug("EXPY: %x", token->kad->expiry);
135         _debug("KVNO: %u", token->kad->kvno);
136         _debug("PRIM: %u", token->kad->primary_flag);
137         _debug("SKEY: %02x%02x%02x%02x%02x%02x%02x%02x",
138                token->kad->session_key[0], token->kad->session_key[1],
139                token->kad->session_key[2], token->kad->session_key[3],
140                token->kad->session_key[4], token->kad->session_key[5],
141                token->kad->session_key[6], token->kad->session_key[7]);
142         if (token->kad->ticket_len >= 8)
143                 _debug("TCKT: %02x%02x%02x%02x%02x%02x%02x%02x",
144                        token->kad->ticket[0], token->kad->ticket[1],
145                        token->kad->ticket[2], token->kad->ticket[3],
146                        token->kad->ticket[4], token->kad->ticket[5],
147                        token->kad->ticket[6], token->kad->ticket[7]);
148
149         /* count the number of tokens attached */
150         prep->payload.data[1] = (void *)((unsigned long)prep->payload.data[1] + 1);
151
152         /* attach the data */
153         for (pptoken = (struct rxrpc_key_token **)&prep->payload.data[0];
154              *pptoken;
155              pptoken = &(*pptoken)->next)
156                 continue;
157         *pptoken = token;
158         expiry = rxrpc_u32_to_time64(token->kad->expiry);
159         if (expiry < prep->expiry)
160                 prep->expiry = expiry;
161
162         _leave(" = 0");
163         return 0;
164 }
165
166 static void rxrpc_free_krb5_principal(struct krb5_principal *princ)
167 {
168         int loop;
169
170         if (princ->name_parts) {
171                 for (loop = princ->n_name_parts - 1; loop >= 0; loop--)
172                         kfree(princ->name_parts[loop]);
173                 kfree(princ->name_parts);
174         }
175         kfree(princ->realm);
176 }
177
178 static void rxrpc_free_krb5_tagged(struct krb5_tagged_data *td)
179 {
180         kfree(td->data);
181 }
182
183 /*
184  * free up an RxK5 token
185  */
186 static void rxrpc_rxk5_free(struct rxk5_key *rxk5)
187 {
188         int loop;
189
190         rxrpc_free_krb5_principal(&rxk5->client);
191         rxrpc_free_krb5_principal(&rxk5->server);
192         rxrpc_free_krb5_tagged(&rxk5->session);
193
194         if (rxk5->addresses) {
195                 for (loop = rxk5->n_addresses - 1; loop >= 0; loop--)
196                         rxrpc_free_krb5_tagged(&rxk5->addresses[loop]);
197                 kfree(rxk5->addresses);
198         }
199         if (rxk5->authdata) {
200                 for (loop = rxk5->n_authdata - 1; loop >= 0; loop--)
201                         rxrpc_free_krb5_tagged(&rxk5->authdata[loop]);
202                 kfree(rxk5->authdata);
203         }
204
205         kfree(rxk5->ticket);
206         kfree(rxk5->ticket2);
207         kfree(rxk5);
208 }
209
210 /*
211  * extract a krb5 principal
212  */
213 static int rxrpc_krb5_decode_principal(struct krb5_principal *princ,
214                                        const __be32 **_xdr,
215                                        unsigned int *_toklen)
216 {
217         const __be32 *xdr = *_xdr;
218         unsigned int toklen = *_toklen, n_parts, loop, tmp, paddedlen;
219
220         /* there must be at least one name, and at least #names+1 length
221          * words */
222         if (toklen <= 12)
223                 return -EINVAL;
224
225         _enter(",{%x,%x,%x},%u",
226                ntohl(xdr[0]), ntohl(xdr[1]), ntohl(xdr[2]), toklen);
227
228         n_parts = ntohl(*xdr++);
229         toklen -= 4;
230         if (n_parts <= 0 || n_parts > AFSTOKEN_K5_COMPONENTS_MAX)
231                 return -EINVAL;
232         princ->n_name_parts = n_parts;
233
234         if (toklen <= (n_parts + 1) * 4)
235                 return -EINVAL;
236
237         princ->name_parts = kcalloc(n_parts, sizeof(char *), GFP_KERNEL);
238         if (!princ->name_parts)
239                 return -ENOMEM;
240
241         for (loop = 0; loop < n_parts; loop++) {
242                 if (toklen < 4)
243                         return -EINVAL;
244                 tmp = ntohl(*xdr++);
245                 toklen -= 4;
246                 if (tmp <= 0 || tmp > AFSTOKEN_STRING_MAX)
247                         return -EINVAL;
248                 paddedlen = (tmp + 3) & ~3;
249                 if (paddedlen > toklen)
250                         return -EINVAL;
251                 princ->name_parts[loop] = kmalloc(tmp + 1, GFP_KERNEL);
252                 if (!princ->name_parts[loop])
253                         return -ENOMEM;
254                 memcpy(princ->name_parts[loop], xdr, tmp);
255                 princ->name_parts[loop][tmp] = 0;
256                 toklen -= paddedlen;
257                 xdr += paddedlen >> 2;
258         }
259
260         if (toklen < 4)
261                 return -EINVAL;
262         tmp = ntohl(*xdr++);
263         toklen -= 4;
264         if (tmp <= 0 || tmp > AFSTOKEN_K5_REALM_MAX)
265                 return -EINVAL;
266         paddedlen = (tmp + 3) & ~3;
267         if (paddedlen > toklen)
268                 return -EINVAL;
269         princ->realm = kmalloc(tmp + 1, GFP_KERNEL);
270         if (!princ->realm)
271                 return -ENOMEM;
272         memcpy(princ->realm, xdr, tmp);
273         princ->realm[tmp] = 0;
274         toklen -= paddedlen;
275         xdr += paddedlen >> 2;
276
277         _debug("%s/...@%s", princ->name_parts[0], princ->realm);
278
279         *_xdr = xdr;
280         *_toklen = toklen;
281         _leave(" = 0 [toklen=%u]", toklen);
282         return 0;
283 }
284
285 /*
286  * extract a piece of krb5 tagged data
287  */
288 static int rxrpc_krb5_decode_tagged_data(struct krb5_tagged_data *td,
289                                          size_t max_data_size,
290                                          const __be32 **_xdr,
291                                          unsigned int *_toklen)
292 {
293         const __be32 *xdr = *_xdr;
294         unsigned int toklen = *_toklen, len, paddedlen;
295
296         /* there must be at least one tag and one length word */
297         if (toklen <= 8)
298                 return -EINVAL;
299
300         _enter(",%zu,{%x,%x},%u",
301                max_data_size, ntohl(xdr[0]), ntohl(xdr[1]), toklen);
302
303         td->tag = ntohl(*xdr++);
304         len = ntohl(*xdr++);
305         toklen -= 8;
306         if (len > max_data_size)
307                 return -EINVAL;
308         paddedlen = (len + 3) & ~3;
309         if (paddedlen > toklen)
310                 return -EINVAL;
311         td->data_len = len;
312
313         if (len > 0) {
314                 td->data = kmemdup(xdr, len, GFP_KERNEL);
315                 if (!td->data)
316                         return -ENOMEM;
317                 toklen -= paddedlen;
318                 xdr += paddedlen >> 2;
319         }
320
321         _debug("tag %x len %x", td->tag, td->data_len);
322
323         *_xdr = xdr;
324         *_toklen = toklen;
325         _leave(" = 0 [toklen=%u]", toklen);
326         return 0;
327 }
328
329 /*
330  * extract an array of tagged data
331  */
332 static int rxrpc_krb5_decode_tagged_array(struct krb5_tagged_data **_td,
333                                           u8 *_n_elem,
334                                           u8 max_n_elem,
335                                           size_t max_elem_size,
336                                           const __be32 **_xdr,
337                                           unsigned int *_toklen)
338 {
339         struct krb5_tagged_data *td;
340         const __be32 *xdr = *_xdr;
341         unsigned int toklen = *_toklen, n_elem, loop;
342         int ret;
343
344         /* there must be at least one count */
345         if (toklen < 4)
346                 return -EINVAL;
347
348         _enter(",,%u,%zu,{%x},%u",
349                max_n_elem, max_elem_size, ntohl(xdr[0]), toklen);
350
351         n_elem = ntohl(*xdr++);
352         toklen -= 4;
353         if (n_elem > max_n_elem)
354                 return -EINVAL;
355         *_n_elem = n_elem;
356         if (n_elem > 0) {
357                 if (toklen <= (n_elem + 1) * 4)
358                         return -EINVAL;
359
360                 _debug("n_elem %d", n_elem);
361
362                 td = kcalloc(n_elem, sizeof(struct krb5_tagged_data),
363                              GFP_KERNEL);
364                 if (!td)
365                         return -ENOMEM;
366                 *_td = td;
367
368                 for (loop = 0; loop < n_elem; loop++) {
369                         ret = rxrpc_krb5_decode_tagged_data(&td[loop],
370                                                             max_elem_size,
371                                                             &xdr, &toklen);
372                         if (ret < 0)
373                                 return ret;
374                 }
375         }
376
377         *_xdr = xdr;
378         *_toklen = toklen;
379         _leave(" = 0 [toklen=%u]", toklen);
380         return 0;
381 }
382
383 /*
384  * extract a krb5 ticket
385  */
386 static int rxrpc_krb5_decode_ticket(u8 **_ticket, u16 *_tktlen,
387                                     const __be32 **_xdr, unsigned int *_toklen)
388 {
389         const __be32 *xdr = *_xdr;
390         unsigned int toklen = *_toklen, len, paddedlen;
391
392         /* there must be at least one length word */
393         if (toklen <= 4)
394                 return -EINVAL;
395
396         _enter(",{%x},%u", ntohl(xdr[0]), toklen);
397
398         len = ntohl(*xdr++);
399         toklen -= 4;
400         if (len > AFSTOKEN_K5_TIX_MAX)
401                 return -EINVAL;
402         paddedlen = (len + 3) & ~3;
403         if (paddedlen > toklen)
404                 return -EINVAL;
405         *_tktlen = len;
406
407         _debug("ticket len %u", len);
408
409         if (len > 0) {
410                 *_ticket = kmemdup(xdr, len, GFP_KERNEL);
411                 if (!*_ticket)
412                         return -ENOMEM;
413                 toklen -= paddedlen;
414                 xdr += paddedlen >> 2;
415         }
416
417         *_xdr = xdr;
418         *_toklen = toklen;
419         _leave(" = 0 [toklen=%u]", toklen);
420         return 0;
421 }
422
423 /*
424  * parse an RxK5 type XDR format token
425  * - the caller guarantees we have at least 4 words
426  */
427 static int rxrpc_preparse_xdr_rxk5(struct key_preparsed_payload *prep,
428                                    size_t datalen,
429                                    const __be32 *xdr, unsigned int toklen)
430 {
431         struct rxrpc_key_token *token, **pptoken;
432         struct rxk5_key *rxk5;
433         const __be32 *end_xdr = xdr + (toklen >> 2);
434         time64_t expiry;
435         int ret;
436
437         _enter(",{%x,%x,%x,%x},%u",
438                ntohl(xdr[0]), ntohl(xdr[1]), ntohl(xdr[2]), ntohl(xdr[3]),
439                toklen);
440
441         /* reserve some payload space for this subkey - the length of the token
442          * is a reasonable approximation */
443         prep->quotalen = datalen + toklen;
444
445         token = kzalloc(sizeof(*token), GFP_KERNEL);
446         if (!token)
447                 return -ENOMEM;
448
449         rxk5 = kzalloc(sizeof(*rxk5), GFP_KERNEL);
450         if (!rxk5) {
451                 kfree(token);
452                 return -ENOMEM;
453         }
454
455         token->security_index = RXRPC_SECURITY_RXK5;
456         token->k5 = rxk5;
457
458         /* extract the principals */
459         ret = rxrpc_krb5_decode_principal(&rxk5->client, &xdr, &toklen);
460         if (ret < 0)
461                 goto error;
462         ret = rxrpc_krb5_decode_principal(&rxk5->server, &xdr, &toklen);
463         if (ret < 0)
464                 goto error;
465
466         /* extract the session key and the encoding type (the tag field ->
467          * ENCTYPE_xxx) */
468         ret = rxrpc_krb5_decode_tagged_data(&rxk5->session, AFSTOKEN_DATA_MAX,
469                                             &xdr, &toklen);
470         if (ret < 0)
471                 goto error;
472
473         if (toklen < 4 * 8 + 2 * 4)
474                 goto inval;
475         rxk5->authtime  = be64_to_cpup((const __be64 *) xdr);
476         xdr += 2;
477         rxk5->starttime = be64_to_cpup((const __be64 *) xdr);
478         xdr += 2;
479         rxk5->endtime   = be64_to_cpup((const __be64 *) xdr);
480         xdr += 2;
481         rxk5->renew_till = be64_to_cpup((const __be64 *) xdr);
482         xdr += 2;
483         rxk5->is_skey = ntohl(*xdr++);
484         rxk5->flags = ntohl(*xdr++);
485         toklen -= 4 * 8 + 2 * 4;
486
487         _debug("times: a=%llx s=%llx e=%llx rt=%llx",
488                rxk5->authtime, rxk5->starttime, rxk5->endtime,
489                rxk5->renew_till);
490         _debug("is_skey=%x flags=%x", rxk5->is_skey, rxk5->flags);
491
492         /* extract the permitted client addresses */
493         ret = rxrpc_krb5_decode_tagged_array(&rxk5->addresses,
494                                              &rxk5->n_addresses,
495                                              AFSTOKEN_K5_ADDRESSES_MAX,
496                                              AFSTOKEN_DATA_MAX,
497                                              &xdr, &toklen);
498         if (ret < 0)
499                 goto error;
500
501         ASSERTCMP((end_xdr - xdr) << 2, ==, toklen);
502
503         /* extract the tickets */
504         ret = rxrpc_krb5_decode_ticket(&rxk5->ticket, &rxk5->ticket_len,
505                                        &xdr, &toklen);
506         if (ret < 0)
507                 goto error;
508         ret = rxrpc_krb5_decode_ticket(&rxk5->ticket2, &rxk5->ticket2_len,
509                                        &xdr, &toklen);
510         if (ret < 0)
511                 goto error;
512
513         ASSERTCMP((end_xdr - xdr) << 2, ==, toklen);
514
515         /* extract the typed auth data */
516         ret = rxrpc_krb5_decode_tagged_array(&rxk5->authdata,
517                                              &rxk5->n_authdata,
518                                              AFSTOKEN_K5_AUTHDATA_MAX,
519                                              AFSTOKEN_BDATALN_MAX,
520                                              &xdr, &toklen);
521         if (ret < 0)
522                 goto error;
523
524         ASSERTCMP((end_xdr - xdr) << 2, ==, toklen);
525
526         if (toklen != 0)
527                 goto inval;
528
529         /* attach the payload */
530         for (pptoken = (struct rxrpc_key_token **)&prep->payload.data[0];
531              *pptoken;
532              pptoken = &(*pptoken)->next)
533                 continue;
534         *pptoken = token;
535         expiry = rxrpc_u32_to_time64(token->k5->endtime);
536         if (expiry < prep->expiry)
537                 prep->expiry = expiry;
538
539         _leave(" = 0");
540         return 0;
541
542 inval:
543         ret = -EINVAL;
544 error:
545         rxrpc_rxk5_free(rxk5);
546         kfree(token);
547         _leave(" = %d", ret);
548         return ret;
549 }
550
551 /*
552  * attempt to parse the data as the XDR format
553  * - the caller guarantees we have more than 7 words
554  */
555 static int rxrpc_preparse_xdr(struct key_preparsed_payload *prep)
556 {
557         const __be32 *xdr = prep->data, *token;
558         const char *cp;
559         unsigned int len, paddedlen, loop, ntoken, toklen, sec_ix;
560         size_t datalen = prep->datalen;
561         int ret;
562
563         _enter(",{%x,%x,%x,%x},%zu",
564                ntohl(xdr[0]), ntohl(xdr[1]), ntohl(xdr[2]), ntohl(xdr[3]),
565                prep->datalen);
566
567         if (datalen > AFSTOKEN_LENGTH_MAX)
568                 goto not_xdr;
569
570         /* XDR is an array of __be32's */
571         if (datalen & 3)
572                 goto not_xdr;
573
574         /* the flags should be 0 (the setpag bit must be handled by
575          * userspace) */
576         if (ntohl(*xdr++) != 0)
577                 goto not_xdr;
578         datalen -= 4;
579
580         /* check the cell name */
581         len = ntohl(*xdr++);
582         if (len < 1 || len > AFSTOKEN_CELL_MAX)
583                 goto not_xdr;
584         datalen -= 4;
585         paddedlen = (len + 3) & ~3;
586         if (paddedlen > datalen)
587                 goto not_xdr;
588
589         cp = (const char *) xdr;
590         for (loop = 0; loop < len; loop++)
591                 if (!isprint(cp[loop]))
592                         goto not_xdr;
593         for (; loop < paddedlen; loop++)
594                 if (cp[loop])
595                         goto not_xdr;
596         _debug("cellname: [%u/%u] '%*.*s'",
597                len, paddedlen, len, len, (const char *) xdr);
598         datalen -= paddedlen;
599         xdr += paddedlen >> 2;
600
601         /* get the token count */
602         if (datalen < 12)
603                 goto not_xdr;
604         ntoken = ntohl(*xdr++);
605         datalen -= 4;
606         _debug("ntoken: %x", ntoken);
607         if (ntoken < 1 || ntoken > AFSTOKEN_MAX)
608                 goto not_xdr;
609
610         /* check each token wrapper */
611         token = xdr;
612         loop = ntoken;
613         do {
614                 if (datalen < 8)
615                         goto not_xdr;
616                 toklen = ntohl(*xdr++);
617                 sec_ix = ntohl(*xdr);
618                 datalen -= 4;
619                 _debug("token: [%x/%zx] %x", toklen, datalen, sec_ix);
620                 paddedlen = (toklen + 3) & ~3;
621                 if (toklen < 20 || toklen > datalen || paddedlen > datalen)
622                         goto not_xdr;
623                 datalen -= paddedlen;
624                 xdr += paddedlen >> 2;
625
626         } while (--loop > 0);
627
628         _debug("remainder: %zu", datalen);
629         if (datalen != 0)
630                 goto not_xdr;
631
632         /* okay: we're going to assume it's valid XDR format
633          * - we ignore the cellname, relying on the key to be correctly named
634          */
635         do {
636                 xdr = token;
637                 toklen = ntohl(*xdr++);
638                 token = xdr + ((toklen + 3) >> 2);
639                 sec_ix = ntohl(*xdr++);
640                 toklen -= 4;
641
642                 _debug("TOKEN type=%u [%p-%p]", sec_ix, xdr, token);
643
644                 switch (sec_ix) {
645                 case RXRPC_SECURITY_RXKAD:
646                         ret = rxrpc_preparse_xdr_rxkad(prep, datalen, xdr, toklen);
647                         if (ret != 0)
648                                 goto error;
649                         break;
650
651                 case RXRPC_SECURITY_RXK5:
652                         ret = rxrpc_preparse_xdr_rxk5(prep, datalen, xdr, toklen);
653                         if (ret != 0)
654                                 goto error;
655                         break;
656
657                 default:
658                         ret = -EPROTONOSUPPORT;
659                         goto error;
660                 }
661
662         } while (--ntoken > 0);
663
664         _leave(" = 0");
665         return 0;
666
667 not_xdr:
668         _leave(" = -EPROTO");
669         return -EPROTO;
670 error:
671         _leave(" = %d", ret);
672         return ret;
673 }
674
675 /*
676  * Preparse an rxrpc defined key.
677  *
678  * Data should be of the form:
679  *      OFFSET  LEN     CONTENT
680  *      0       4       key interface version number
681  *      4       2       security index (type)
682  *      6       2       ticket length
683  *      8       4       key expiry time (time_t)
684  *      12      4       kvno
685  *      16      8       session key
686  *      24      [len]   ticket
687  *
688  * if no data is provided, then a no-security key is made
689  */
690 static int rxrpc_preparse(struct key_preparsed_payload *prep)
691 {
692         const struct rxrpc_key_data_v1 *v1;
693         struct rxrpc_key_token *token, **pp;
694         time64_t expiry;
695         size_t plen;
696         u32 kver;
697         int ret;
698
699         _enter("%zu", prep->datalen);
700
701         /* handle a no-security key */
702         if (!prep->data && prep->datalen == 0)
703                 return 0;
704
705         /* determine if the XDR payload format is being used */
706         if (prep->datalen > 7 * 4) {
707                 ret = rxrpc_preparse_xdr(prep);
708                 if (ret != -EPROTO)
709                         return ret;
710         }
711
712         /* get the key interface version number */
713         ret = -EINVAL;
714         if (prep->datalen <= 4 || !prep->data)
715                 goto error;
716         memcpy(&kver, prep->data, sizeof(kver));
717         prep->data += sizeof(kver);
718         prep->datalen -= sizeof(kver);
719
720         _debug("KEY I/F VERSION: %u", kver);
721
722         ret = -EKEYREJECTED;
723         if (kver != 1)
724                 goto error;
725
726         /* deal with a version 1 key */
727         ret = -EINVAL;
728         if (prep->datalen < sizeof(*v1))
729                 goto error;
730
731         v1 = prep->data;
732         if (prep->datalen != sizeof(*v1) + v1->ticket_length)
733                 goto error;
734
735         _debug("SCIX: %u", v1->security_index);
736         _debug("TLEN: %u", v1->ticket_length);
737         _debug("EXPY: %x", v1->expiry);
738         _debug("KVNO: %u", v1->kvno);
739         _debug("SKEY: %02x%02x%02x%02x%02x%02x%02x%02x",
740                v1->session_key[0], v1->session_key[1],
741                v1->session_key[2], v1->session_key[3],
742                v1->session_key[4], v1->session_key[5],
743                v1->session_key[6], v1->session_key[7]);
744         if (v1->ticket_length >= 8)
745                 _debug("TCKT: %02x%02x%02x%02x%02x%02x%02x%02x",
746                        v1->ticket[0], v1->ticket[1],
747                        v1->ticket[2], v1->ticket[3],
748                        v1->ticket[4], v1->ticket[5],
749                        v1->ticket[6], v1->ticket[7]);
750
751         ret = -EPROTONOSUPPORT;
752         if (v1->security_index != RXRPC_SECURITY_RXKAD)
753                 goto error;
754
755         plen = sizeof(*token->kad) + v1->ticket_length;
756         prep->quotalen = plen + sizeof(*token);
757
758         ret = -ENOMEM;
759         token = kzalloc(sizeof(*token), GFP_KERNEL);
760         if (!token)
761                 goto error;
762         token->kad = kzalloc(plen, GFP_KERNEL);
763         if (!token->kad)
764                 goto error_free;
765
766         token->security_index           = RXRPC_SECURITY_RXKAD;
767         token->kad->ticket_len          = v1->ticket_length;
768         token->kad->expiry              = v1->expiry;
769         token->kad->kvno                = v1->kvno;
770         memcpy(&token->kad->session_key, &v1->session_key, 8);
771         memcpy(&token->kad->ticket, v1->ticket, v1->ticket_length);
772
773         /* count the number of tokens attached */
774         prep->payload.data[1] = (void *)((unsigned long)prep->payload.data[1] + 1);
775
776         /* attach the data */
777         pp = (struct rxrpc_key_token **)&prep->payload.data[0];
778         while (*pp)
779                 pp = &(*pp)->next;
780         *pp = token;
781         expiry = rxrpc_u32_to_time64(token->kad->expiry);
782         if (expiry < prep->expiry)
783                 prep->expiry = expiry;
784         token = NULL;
785         ret = 0;
786
787 error_free:
788         kfree(token);
789 error:
790         return ret;
791 }
792
793 /*
794  * Free token list.
795  */
796 static void rxrpc_free_token_list(struct rxrpc_key_token *token)
797 {
798         struct rxrpc_key_token *next;
799
800         for (; token; token = next) {
801                 next = token->next;
802                 switch (token->security_index) {
803                 case RXRPC_SECURITY_RXKAD:
804                         kfree(token->kad);
805                         break;
806                 case RXRPC_SECURITY_RXK5:
807                         if (token->k5)
808                                 rxrpc_rxk5_free(token->k5);
809                         break;
810                 default:
811                         pr_err("Unknown token type %x on rxrpc key\n",
812                                token->security_index);
813                         BUG();
814                 }
815
816                 kfree(token);
817         }
818 }
819
820 /*
821  * Clean up preparse data.
822  */
823 static void rxrpc_free_preparse(struct key_preparsed_payload *prep)
824 {
825         rxrpc_free_token_list(prep->payload.data[0]);
826 }
827
828 /*
829  * Preparse a server secret key.
830  *
831  * The data should be the 8-byte secret key.
832  */
833 static int rxrpc_preparse_s(struct key_preparsed_payload *prep)
834 {
835         struct crypto_skcipher *ci;
836
837         _enter("%zu", prep->datalen);
838
839         if (prep->datalen != 8)
840                 return -EINVAL;
841
842         memcpy(&prep->payload.data[2], prep->data, 8);
843
844         ci = crypto_alloc_skcipher("pcbc(des)", 0, CRYPTO_ALG_ASYNC);
845         if (IS_ERR(ci)) {
846                 _leave(" = %ld", PTR_ERR(ci));
847                 return PTR_ERR(ci);
848         }
849
850         if (crypto_skcipher_setkey(ci, prep->data, 8) < 0)
851                 BUG();
852
853         prep->payload.data[0] = ci;
854         _leave(" = 0");
855         return 0;
856 }
857
858 /*
859  * Clean up preparse data.
860  */
861 static void rxrpc_free_preparse_s(struct key_preparsed_payload *prep)
862 {
863         if (prep->payload.data[0])
864                 crypto_free_skcipher(prep->payload.data[0]);
865 }
866
867 /*
868  * dispose of the data dangling from the corpse of a rxrpc key
869  */
870 static void rxrpc_destroy(struct key *key)
871 {
872         rxrpc_free_token_list(key->payload.data[0]);
873 }
874
875 /*
876  * dispose of the data dangling from the corpse of a rxrpc key
877  */
878 static void rxrpc_destroy_s(struct key *key)
879 {
880         if (key->payload.data[0]) {
881                 crypto_free_skcipher(key->payload.data[0]);
882                 key->payload.data[0] = NULL;
883         }
884 }
885
886 /*
887  * describe the rxrpc key
888  */
889 static void rxrpc_describe(const struct key *key, struct seq_file *m)
890 {
891         seq_puts(m, key->description);
892 }
893
894 /*
895  * grab the security key for a socket
896  */
897 int rxrpc_request_key(struct rxrpc_sock *rx, char __user *optval, int optlen)
898 {
899         struct key *key;
900         char *description;
901
902         _enter("");
903
904         if (optlen <= 0 || optlen > PAGE_SIZE - 1)
905                 return -EINVAL;
906
907         description = memdup_user_nul(optval, optlen);
908         if (IS_ERR(description))
909                 return PTR_ERR(description);
910
911         key = request_key(&key_type_rxrpc, description, NULL);
912         if (IS_ERR(key)) {
913                 kfree(description);
914                 _leave(" = %ld", PTR_ERR(key));
915                 return PTR_ERR(key);
916         }
917
918         rx->key = key;
919         kfree(description);
920         _leave(" = 0 [key %x]", key->serial);
921         return 0;
922 }
923
924 /*
925  * grab the security keyring for a server socket
926  */
927 int rxrpc_server_keyring(struct rxrpc_sock *rx, char __user *optval,
928                          int optlen)
929 {
930         struct key *key;
931         char *description;
932
933         _enter("");
934
935         if (optlen <= 0 || optlen > PAGE_SIZE - 1)
936                 return -EINVAL;
937
938         description = memdup_user_nul(optval, optlen);
939         if (IS_ERR(description))
940                 return PTR_ERR(description);
941
942         key = request_key(&key_type_keyring, description, NULL);
943         if (IS_ERR(key)) {
944                 kfree(description);
945                 _leave(" = %ld", PTR_ERR(key));
946                 return PTR_ERR(key);
947         }
948
949         rx->securities = key;
950         kfree(description);
951         _leave(" = 0 [key %x]", key->serial);
952         return 0;
953 }
954
955 /*
956  * generate a server data key
957  */
958 int rxrpc_get_server_data_key(struct rxrpc_connection *conn,
959                               const void *session_key,
960                               time64_t expiry,
961                               u32 kvno)
962 {
963         const struct cred *cred = current_cred();
964         struct key *key;
965         int ret;
966
967         struct {
968                 u32 kver;
969                 struct rxrpc_key_data_v1 v1;
970         } data;
971
972         _enter("");
973
974         key = key_alloc(&key_type_rxrpc, "x",
975                         GLOBAL_ROOT_UID, GLOBAL_ROOT_GID, cred, 0,
976                         KEY_ALLOC_NOT_IN_QUOTA, NULL);
977         if (IS_ERR(key)) {
978                 _leave(" = -ENOMEM [alloc %ld]", PTR_ERR(key));
979                 return -ENOMEM;
980         }
981
982         _debug("key %d", key_serial(key));
983
984         data.kver = 1;
985         data.v1.security_index = RXRPC_SECURITY_RXKAD;
986         data.v1.ticket_length = 0;
987         data.v1.expiry = rxrpc_time64_to_u32(expiry);
988         data.v1.kvno = 0;
989
990         memcpy(&data.v1.session_key, session_key, sizeof(data.v1.session_key));
991
992         ret = key_instantiate_and_link(key, &data, sizeof(data), NULL, NULL);
993         if (ret < 0)
994                 goto error;
995
996         conn->params.key = key;
997         _leave(" = 0 [%d]", key_serial(key));
998         return 0;
999
1000 error:
1001         key_revoke(key);
1002         key_put(key);
1003         _leave(" = -ENOMEM [ins %d]", ret);
1004         return -ENOMEM;
1005 }
1006 EXPORT_SYMBOL(rxrpc_get_server_data_key);
1007
1008 /**
1009  * rxrpc_get_null_key - Generate a null RxRPC key
1010  * @keyname: The name to give the key.
1011  *
1012  * Generate a null RxRPC key that can be used to indicate anonymous security is
1013  * required for a particular domain.
1014  */
1015 struct key *rxrpc_get_null_key(const char *keyname)
1016 {
1017         const struct cred *cred = current_cred();
1018         struct key *key;
1019         int ret;
1020
1021         key = key_alloc(&key_type_rxrpc, keyname,
1022                         GLOBAL_ROOT_UID, GLOBAL_ROOT_GID, cred,
1023                         KEY_POS_SEARCH, KEY_ALLOC_NOT_IN_QUOTA, NULL);
1024         if (IS_ERR(key))
1025                 return key;
1026
1027         ret = key_instantiate_and_link(key, NULL, 0, NULL, NULL);
1028         if (ret < 0) {
1029                 key_revoke(key);
1030                 key_put(key);
1031                 return ERR_PTR(ret);
1032         }
1033
1034         return key;
1035 }
1036 EXPORT_SYMBOL(rxrpc_get_null_key);
1037
1038 /*
1039  * read the contents of an rxrpc key
1040  * - this returns the result in XDR form
1041  */
1042 static long rxrpc_read(const struct key *key,
1043                        char __user *buffer, size_t buflen)
1044 {
1045         const struct rxrpc_key_token *token;
1046         const struct krb5_principal *princ;
1047         size_t size;
1048         __be32 __user *xdr, *oldxdr;
1049         u32 cnlen, toksize, ntoks, tok, zero;
1050         u16 toksizes[AFSTOKEN_MAX];
1051         int loop;
1052
1053         _enter("");
1054
1055         /* we don't know what form we should return non-AFS keys in */
1056         if (memcmp(key->description, "afs@", 4) != 0)
1057                 return -EOPNOTSUPP;
1058         cnlen = strlen(key->description + 4);
1059
1060 #define RND(X) (((X) + 3) & ~3)
1061
1062         /* AFS keys we return in XDR form, so we need to work out the size of
1063          * the XDR */
1064         size = 2 * 4;   /* flags, cellname len */
1065         size += RND(cnlen);     /* cellname */
1066         size += 1 * 4;  /* token count */
1067
1068         ntoks = 0;
1069         for (token = key->payload.data[0]; token; token = token->next) {
1070                 toksize = 4;    /* sec index */
1071
1072                 switch (token->security_index) {
1073                 case RXRPC_SECURITY_RXKAD:
1074                         toksize += 9 * 4;       /* viceid, kvno, key*2 + len, begin,
1075                                                  * end, primary, tktlen */
1076                         toksize += RND(token->kad->ticket_len);
1077                         break;
1078
1079                 case RXRPC_SECURITY_RXK5:
1080                         princ = &token->k5->client;
1081                         toksize += 4 + princ->n_name_parts * 4;
1082                         for (loop = 0; loop < princ->n_name_parts; loop++)
1083                                 toksize += RND(strlen(princ->name_parts[loop]));
1084                         toksize += 4 + RND(strlen(princ->realm));
1085
1086                         princ = &token->k5->server;
1087                         toksize += 4 + princ->n_name_parts * 4;
1088                         for (loop = 0; loop < princ->n_name_parts; loop++)
1089                                 toksize += RND(strlen(princ->name_parts[loop]));
1090                         toksize += 4 + RND(strlen(princ->realm));
1091
1092                         toksize += 8 + RND(token->k5->session.data_len);
1093
1094                         toksize += 4 * 8 + 2 * 4;
1095
1096                         toksize += 4 + token->k5->n_addresses * 8;
1097                         for (loop = 0; loop < token->k5->n_addresses; loop++)
1098                                 toksize += RND(token->k5->addresses[loop].data_len);
1099
1100                         toksize += 4 + RND(token->k5->ticket_len);
1101                         toksize += 4 + RND(token->k5->ticket2_len);
1102
1103                         toksize += 4 + token->k5->n_authdata * 8;
1104                         for (loop = 0; loop < token->k5->n_authdata; loop++)
1105                                 toksize += RND(token->k5->authdata[loop].data_len);
1106                         break;
1107
1108                 default: /* we have a ticket we can't encode */
1109                         BUG();
1110                         continue;
1111                 }
1112
1113                 _debug("token[%u]: toksize=%u", ntoks, toksize);
1114                 ASSERTCMP(toksize, <=, AFSTOKEN_LENGTH_MAX);
1115
1116                 toksizes[ntoks++] = toksize;
1117                 size += toksize + 4; /* each token has a length word */
1118         }
1119
1120 #undef RND
1121
1122         if (!buffer || buflen < size)
1123                 return size;
1124
1125         xdr = (__be32 __user *) buffer;
1126         zero = 0;
1127 #define ENCODE(x)                               \
1128         do {                                    \
1129                 __be32 y = htonl(x);            \
1130                 if (put_user(y, xdr++) < 0)     \
1131                         goto fault;             \
1132         } while(0)
1133 #define ENCODE_DATA(l, s)                                               \
1134         do {                                                            \
1135                 u32 _l = (l);                                           \
1136                 ENCODE(l);                                              \
1137                 if (copy_to_user(xdr, (s), _l) != 0)                    \
1138                         goto fault;                                     \
1139                 if (_l & 3 &&                                           \
1140                     copy_to_user((u8 __user *)xdr + _l, &zero, 4 - (_l & 3)) != 0) \
1141                         goto fault;                                     \
1142                 xdr += (_l + 3) >> 2;                                   \
1143         } while(0)
1144 #define ENCODE64(x)                                     \
1145         do {                                            \
1146                 __be64 y = cpu_to_be64(x);              \
1147                 if (copy_to_user(xdr, &y, 8) != 0)      \
1148                         goto fault;                     \
1149                 xdr += 8 >> 2;                          \
1150         } while(0)
1151 #define ENCODE_STR(s)                           \
1152         do {                                    \
1153                 const char *_s = (s);           \
1154                 ENCODE_DATA(strlen(_s), _s);    \
1155         } while(0)
1156
1157         ENCODE(0);                                      /* flags */
1158         ENCODE_DATA(cnlen, key->description + 4);       /* cellname */
1159         ENCODE(ntoks);
1160
1161         tok = 0;
1162         for (token = key->payload.data[0]; token; token = token->next) {
1163                 toksize = toksizes[tok++];
1164                 ENCODE(toksize);
1165                 oldxdr = xdr;
1166                 ENCODE(token->security_index);
1167
1168                 switch (token->security_index) {
1169                 case RXRPC_SECURITY_RXKAD:
1170                         ENCODE(token->kad->vice_id);
1171                         ENCODE(token->kad->kvno);
1172                         ENCODE_DATA(8, token->kad->session_key);
1173                         ENCODE(token->kad->start);
1174                         ENCODE(token->kad->expiry);
1175                         ENCODE(token->kad->primary_flag);
1176                         ENCODE_DATA(token->kad->ticket_len, token->kad->ticket);
1177                         break;
1178
1179                 case RXRPC_SECURITY_RXK5:
1180                         princ = &token->k5->client;
1181                         ENCODE(princ->n_name_parts);
1182                         for (loop = 0; loop < princ->n_name_parts; loop++)
1183                                 ENCODE_STR(princ->name_parts[loop]);
1184                         ENCODE_STR(princ->realm);
1185
1186                         princ = &token->k5->server;
1187                         ENCODE(princ->n_name_parts);
1188                         for (loop = 0; loop < princ->n_name_parts; loop++)
1189                                 ENCODE_STR(princ->name_parts[loop]);
1190                         ENCODE_STR(princ->realm);
1191
1192                         ENCODE(token->k5->session.tag);
1193                         ENCODE_DATA(token->k5->session.data_len,
1194                                     token->k5->session.data);
1195
1196                         ENCODE64(token->k5->authtime);
1197                         ENCODE64(token->k5->starttime);
1198                         ENCODE64(token->k5->endtime);
1199                         ENCODE64(token->k5->renew_till);
1200                         ENCODE(token->k5->is_skey);
1201                         ENCODE(token->k5->flags);
1202
1203                         ENCODE(token->k5->n_addresses);
1204                         for (loop = 0; loop < token->k5->n_addresses; loop++) {
1205                                 ENCODE(token->k5->addresses[loop].tag);
1206                                 ENCODE_DATA(token->k5->addresses[loop].data_len,
1207                                             token->k5->addresses[loop].data);
1208                         }
1209
1210                         ENCODE_DATA(token->k5->ticket_len, token->k5->ticket);
1211                         ENCODE_DATA(token->k5->ticket2_len, token->k5->ticket2);
1212
1213                         ENCODE(token->k5->n_authdata);
1214                         for (loop = 0; loop < token->k5->n_authdata; loop++) {
1215                                 ENCODE(token->k5->authdata[loop].tag);
1216                                 ENCODE_DATA(token->k5->authdata[loop].data_len,
1217                                             token->k5->authdata[loop].data);
1218                         }
1219                         break;
1220
1221                 default:
1222                         BUG();
1223                         break;
1224                 }
1225
1226                 ASSERTCMP((unsigned long)xdr - (unsigned long)oldxdr, ==,
1227                           toksize);
1228         }
1229
1230 #undef ENCODE_STR
1231 #undef ENCODE_DATA
1232 #undef ENCODE64
1233 #undef ENCODE
1234
1235         ASSERTCMP(tok, ==, ntoks);
1236         ASSERTCMP((char __user *) xdr - buffer, ==, size);
1237         _leave(" = %zu", size);
1238         return size;
1239
1240 fault:
1241         _leave(" = -EFAULT");
1242         return -EFAULT;
1243 }