2 * linux/net/sunrpc/gss_krb5_crypto.c
4 * Copyright (c) 2000-2008 The Regents of the University of Michigan.
7 * Andy Adamson <andros@umich.edu>
8 * Bruce Fields <bfields@umich.edu>
12 * Copyright (C) 1998 by the FundsXpress, INC.
14 * All rights reserved.
16 * Export of this software from the United States of America may require
17 * a specific license from the United States Government. It is the
18 * responsibility of any person or organization contemplating export to
19 * obtain such a license before exporting.
21 * WITHIN THAT CONSTRAINT, permission to use, copy, modify, and
22 * distribute this software and its documentation for any purpose and
23 * without fee is hereby granted, provided that the above copyright
24 * notice appear in all copies and that both that copyright notice and
25 * this permission notice appear in supporting documentation, and that
26 * the name of FundsXpress. not be used in advertising or publicity pertaining
27 * to distribution of the software without specific, written prior
28 * permission. FundsXpress makes no representations about the suitability of
29 * this software for any purpose. It is provided "as is" without express
30 * or implied warranty.
32 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
33 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
34 * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
37 #include <crypto/hash.h>
38 #include <crypto/skcipher.h>
39 #include <crypto/utils.h>
40 #include <linux/err.h>
41 #include <linux/types.h>
43 #include <linux/scatterlist.h>
44 #include <linux/highmem.h>
45 #include <linux/pagemap.h>
46 #include <linux/random.h>
47 #include <linux/sunrpc/gss_krb5.h>
48 #include <linux/sunrpc/xdr.h>
49 #include <kunit/visibility.h>
51 #include "gss_krb5_internal.h"
53 #if IS_ENABLED(CONFIG_SUNRPC_DEBUG)
54 # define RPCDBG_FACILITY RPCDBG_AUTH
58 * krb5_make_confounder - Generate a confounder string
59 * @p: memory location into which to write the string
60 * @conflen: string length to write, in octets
62 * RFCs 1964 and 3961 mention only "a random confounder" without going
63 * into detail about its function or cryptographic requirements. The
64 * assumed purpose is to prevent repeated encryption of a plaintext with
65 * the same key from generating the same ciphertext. It is also used to
66 * pad minimum plaintext length to at least a single cipher block.
68 * However, in situations like the GSS Kerberos 5 mechanism, where the
69 * encryption IV is always all zeroes, the confounder also effectively
70 * functions like an IV. Thus, not only must it be unique from message
71 * to message, but it must also be difficult to predict. Otherwise an
72 * attacker can correlate the confounder to previous or future values,
73 * making the encryption easier to break.
75 * Given that the primary consumer of this encryption mechanism is a
76 * network storage protocol, a type of traffic that often carries
77 * predictable payloads (eg, all zeroes when reading unallocated blocks
78 * from a file), our confounder generation has to be cryptographically
81 void krb5_make_confounder(u8
*p
, int conflen
)
83 get_random_bytes(p
, conflen
);
87 * krb5_encrypt - simple encryption of an RPCSEC GSS payload
88 * @tfm: initialized cipher transform
89 * @iv: pointer to an IV
90 * @in: plaintext to encrypt
91 * @out: OUT: ciphertext
92 * @length: length of input and output buffers, in bytes
94 * @iv may be NULL to force the use of an all-zero IV.
95 * The buffer containing the IV must be as large as the
99 * %0: @in successfully encrypted into @out
100 * negative errno: @in not encrypted
104 struct crypto_sync_skcipher
*tfm
,
111 struct scatterlist sg
[1];
112 u8 local_iv
[GSS_KRB5_MAX_BLOCKSIZE
] = {0};
113 SYNC_SKCIPHER_REQUEST_ON_STACK(req
, tfm
);
115 if (length
% crypto_sync_skcipher_blocksize(tfm
) != 0)
118 if (crypto_sync_skcipher_ivsize(tfm
) > GSS_KRB5_MAX_BLOCKSIZE
) {
119 dprintk("RPC: gss_k5encrypt: tfm iv size too large %d\n",
120 crypto_sync_skcipher_ivsize(tfm
));
125 memcpy(local_iv
, iv
, crypto_sync_skcipher_ivsize(tfm
));
127 memcpy(out
, in
, length
);
128 sg_init_one(sg
, out
, length
);
130 skcipher_request_set_sync_tfm(req
, tfm
);
131 skcipher_request_set_callback(req
, 0, NULL
, NULL
);
132 skcipher_request_set_crypt(req
, sg
, sg
, length
, local_iv
);
134 ret
= crypto_skcipher_encrypt(req
);
135 skcipher_request_zero(req
);
137 dprintk("RPC: krb5_encrypt returns %d\n", ret
);
142 * krb5_decrypt - simple decryption of an RPCSEC GSS payload
143 * @tfm: initialized cipher transform
144 * @iv: pointer to an IV
145 * @in: ciphertext to decrypt
146 * @out: OUT: plaintext
147 * @length: length of input and output buffers, in bytes
149 * @iv may be NULL to force the use of an all-zero IV.
150 * The buffer containing the IV must be as large as the
154 * %0: @in successfully decrypted into @out
155 * negative errno: @in not decrypted
159 struct crypto_sync_skcipher
*tfm
,
166 struct scatterlist sg
[1];
167 u8 local_iv
[GSS_KRB5_MAX_BLOCKSIZE
] = {0};
168 SYNC_SKCIPHER_REQUEST_ON_STACK(req
, tfm
);
170 if (length
% crypto_sync_skcipher_blocksize(tfm
) != 0)
173 if (crypto_sync_skcipher_ivsize(tfm
) > GSS_KRB5_MAX_BLOCKSIZE
) {
174 dprintk("RPC: gss_k5decrypt: tfm iv size too large %d\n",
175 crypto_sync_skcipher_ivsize(tfm
));
179 memcpy(local_iv
, iv
, crypto_sync_skcipher_ivsize(tfm
));
181 memcpy(out
, in
, length
);
182 sg_init_one(sg
, out
, length
);
184 skcipher_request_set_sync_tfm(req
, tfm
);
185 skcipher_request_set_callback(req
, 0, NULL
, NULL
);
186 skcipher_request_set_crypt(req
, sg
, sg
, length
, local_iv
);
188 ret
= crypto_skcipher_decrypt(req
);
189 skcipher_request_zero(req
);
191 dprintk("RPC: gss_k5decrypt returns %d\n",ret
);
196 checksummer(struct scatterlist
*sg
, void *data
)
198 struct ahash_request
*req
= data
;
200 ahash_request_set_crypt(req
, sg
, NULL
, sg
->length
);
202 return crypto_ahash_update(req
);
206 * checksum the plaintext data and hdrlen bytes of the token header
207 * The checksum is performed over the first 8 bytes of the
208 * gss token header and then over the data body
211 make_checksum(struct krb5_ctx
*kctx
, char *header
, int hdrlen
,
212 struct xdr_buf
*body
, int body_offset
, u8
*cksumkey
,
213 unsigned int usage
, struct xdr_netobj
*cksumout
)
215 struct crypto_ahash
*tfm
;
216 struct ahash_request
*req
;
217 struct scatterlist sg
[1];
220 unsigned int checksumlen
;
222 if (cksumout
->len
< kctx
->gk5e
->cksumlength
) {
223 dprintk("%s: checksum buffer length, %u, too small for %s\n",
224 __func__
, cksumout
->len
, kctx
->gk5e
->name
);
225 return GSS_S_FAILURE
;
228 checksumdata
= kmalloc(GSS_KRB5_MAX_CKSUM_LEN
, GFP_KERNEL
);
229 if (checksumdata
== NULL
)
230 return GSS_S_FAILURE
;
232 tfm
= crypto_alloc_ahash(kctx
->gk5e
->cksum_name
, 0, CRYPTO_ALG_ASYNC
);
236 req
= ahash_request_alloc(tfm
, GFP_KERNEL
);
240 ahash_request_set_callback(req
, CRYPTO_TFM_REQ_MAY_SLEEP
, NULL
, NULL
);
242 checksumlen
= crypto_ahash_digestsize(tfm
);
244 if (cksumkey
!= NULL
) {
245 err
= crypto_ahash_setkey(tfm
, cksumkey
,
246 kctx
->gk5e
->keylength
);
251 err
= crypto_ahash_init(req
);
254 sg_init_one(sg
, header
, hdrlen
);
255 ahash_request_set_crypt(req
, sg
, NULL
, hdrlen
);
256 err
= crypto_ahash_update(req
);
259 err
= xdr_process_buf(body
, body_offset
, body
->len
- body_offset
,
263 ahash_request_set_crypt(req
, NULL
, checksumdata
, 0);
264 err
= crypto_ahash_final(req
);
268 switch (kctx
->gk5e
->ctype
) {
269 case CKSUMTYPE_RSA_MD5
:
270 err
= krb5_encrypt(kctx
->seq
, NULL
, checksumdata
,
271 checksumdata
, checksumlen
);
274 memcpy(cksumout
->data
,
275 checksumdata
+ checksumlen
- kctx
->gk5e
->cksumlength
,
276 kctx
->gk5e
->cksumlength
);
278 case CKSUMTYPE_HMAC_SHA1_DES3
:
279 memcpy(cksumout
->data
, checksumdata
, kctx
->gk5e
->cksumlength
);
285 cksumout
->len
= kctx
->gk5e
->cksumlength
;
287 ahash_request_free(req
);
289 crypto_free_ahash(tfm
);
292 return err
? GSS_S_FAILURE
: 0;
296 * gss_krb5_checksum - Compute the MAC for a GSS Wrap or MIC token
297 * @tfm: an initialized hash transform
298 * @header: pointer to a buffer containing the token header, or NULL
299 * @hdrlen: number of octets in @header
300 * @body: xdr_buf containing an RPC message (body.len is the message length)
301 * @body_offset: byte offset into @body to start checksumming
302 * @cksumout: OUT: a buffer to be filled in with the computed HMAC
304 * Usually expressed as H = HMAC(K, message)[1..h] .
306 * Caller provides the truncation length of the output token (h) in
310 * %GSS_S_COMPLETE: Digest computed, @cksumout filled in
311 * %GSS_S_FAILURE: Call failed
314 gss_krb5_checksum(struct crypto_ahash
*tfm
, char *header
, int hdrlen
,
315 const struct xdr_buf
*body
, int body_offset
,
316 struct xdr_netobj
*cksumout
)
318 struct ahash_request
*req
;
322 checksumdata
= kmalloc(crypto_ahash_digestsize(tfm
), GFP_KERNEL
);
324 return GSS_S_FAILURE
;
326 req
= ahash_request_alloc(tfm
, GFP_KERNEL
);
329 ahash_request_set_callback(req
, CRYPTO_TFM_REQ_MAY_SLEEP
, NULL
, NULL
);
330 err
= crypto_ahash_init(req
);
335 * Per RFC 4121 Section 4.2.4, the checksum is performed over the
336 * data body first, then over the octets in "header".
338 err
= xdr_process_buf(body
, body_offset
, body
->len
- body_offset
,
343 struct scatterlist sg
[1];
345 sg_init_one(sg
, header
, hdrlen
);
346 ahash_request_set_crypt(req
, sg
, NULL
, hdrlen
);
347 err
= crypto_ahash_update(req
);
352 ahash_request_set_crypt(req
, NULL
, checksumdata
, 0);
353 err
= crypto_ahash_final(req
);
357 memcpy(cksumout
->data
, checksumdata
,
358 min_t(int, cksumout
->len
, crypto_ahash_digestsize(tfm
)));
361 ahash_request_free(req
);
363 kfree_sensitive(checksumdata
);
364 return err
? GSS_S_FAILURE
: GSS_S_COMPLETE
;
366 EXPORT_SYMBOL_IF_KUNIT(gss_krb5_checksum
);
368 struct encryptor_desc
{
369 u8 iv
[GSS_KRB5_MAX_BLOCKSIZE
];
370 struct skcipher_request
*req
;
372 struct xdr_buf
*outbuf
;
374 struct scatterlist infrags
[4];
375 struct scatterlist outfrags
[4];
381 encryptor(struct scatterlist
*sg
, void *data
)
383 struct encryptor_desc
*desc
= data
;
384 struct xdr_buf
*outbuf
= desc
->outbuf
;
385 struct crypto_sync_skcipher
*tfm
=
386 crypto_sync_skcipher_reqtfm(desc
->req
);
387 struct page
*in_page
;
388 int thislen
= desc
->fraglen
+ sg
->length
;
392 /* Worst case is 4 fragments: head, end of page 1, start
393 * of page 2, tail. Anything more is a bug. */
394 BUG_ON(desc
->fragno
> 3);
396 page_pos
= desc
->pos
- outbuf
->head
[0].iov_len
;
397 if (page_pos
>= 0 && page_pos
< outbuf
->page_len
) {
398 /* pages are not in place: */
399 int i
= (page_pos
+ outbuf
->page_base
) >> PAGE_SHIFT
;
400 in_page
= desc
->pages
[i
];
402 in_page
= sg_page(sg
);
404 sg_set_page(&desc
->infrags
[desc
->fragno
], in_page
, sg
->length
,
406 sg_set_page(&desc
->outfrags
[desc
->fragno
], sg_page(sg
), sg
->length
,
409 desc
->fraglen
+= sg
->length
;
410 desc
->pos
+= sg
->length
;
412 fraglen
= thislen
& (crypto_sync_skcipher_blocksize(tfm
) - 1);
418 sg_mark_end(&desc
->infrags
[desc
->fragno
- 1]);
419 sg_mark_end(&desc
->outfrags
[desc
->fragno
- 1]);
421 skcipher_request_set_crypt(desc
->req
, desc
->infrags
, desc
->outfrags
,
424 ret
= crypto_skcipher_encrypt(desc
->req
);
428 sg_init_table(desc
->infrags
, 4);
429 sg_init_table(desc
->outfrags
, 4);
432 sg_set_page(&desc
->outfrags
[0], sg_page(sg
), fraglen
,
433 sg
->offset
+ sg
->length
- fraglen
);
434 desc
->infrags
[0] = desc
->outfrags
[0];
435 sg_assign_page(&desc
->infrags
[0], in_page
);
437 desc
->fraglen
= fraglen
;
446 gss_encrypt_xdr_buf(struct crypto_sync_skcipher
*tfm
, struct xdr_buf
*buf
,
447 int offset
, struct page
**pages
)
450 struct encryptor_desc desc
;
451 SYNC_SKCIPHER_REQUEST_ON_STACK(req
, tfm
);
453 BUG_ON((buf
->len
- offset
) % crypto_sync_skcipher_blocksize(tfm
) != 0);
455 skcipher_request_set_sync_tfm(req
, tfm
);
456 skcipher_request_set_callback(req
, 0, NULL
, NULL
);
458 memset(desc
.iv
, 0, sizeof(desc
.iv
));
466 sg_init_table(desc
.infrags
, 4);
467 sg_init_table(desc
.outfrags
, 4);
469 ret
= xdr_process_buf(buf
, offset
, buf
->len
- offset
, encryptor
, &desc
);
470 skcipher_request_zero(req
);
474 struct decryptor_desc
{
475 u8 iv
[GSS_KRB5_MAX_BLOCKSIZE
];
476 struct skcipher_request
*req
;
477 struct scatterlist frags
[4];
483 decryptor(struct scatterlist
*sg
, void *data
)
485 struct decryptor_desc
*desc
= data
;
486 int thislen
= desc
->fraglen
+ sg
->length
;
487 struct crypto_sync_skcipher
*tfm
=
488 crypto_sync_skcipher_reqtfm(desc
->req
);
491 /* Worst case is 4 fragments: head, end of page 1, start
492 * of page 2, tail. Anything more is a bug. */
493 BUG_ON(desc
->fragno
> 3);
494 sg_set_page(&desc
->frags
[desc
->fragno
], sg_page(sg
), sg
->length
,
497 desc
->fraglen
+= sg
->length
;
499 fraglen
= thislen
& (crypto_sync_skcipher_blocksize(tfm
) - 1);
505 sg_mark_end(&desc
->frags
[desc
->fragno
- 1]);
507 skcipher_request_set_crypt(desc
->req
, desc
->frags
, desc
->frags
,
510 ret
= crypto_skcipher_decrypt(desc
->req
);
514 sg_init_table(desc
->frags
, 4);
517 sg_set_page(&desc
->frags
[0], sg_page(sg
), fraglen
,
518 sg
->offset
+ sg
->length
- fraglen
);
520 desc
->fraglen
= fraglen
;
529 gss_decrypt_xdr_buf(struct crypto_sync_skcipher
*tfm
, struct xdr_buf
*buf
,
533 struct decryptor_desc desc
;
534 SYNC_SKCIPHER_REQUEST_ON_STACK(req
, tfm
);
537 BUG_ON((buf
->len
- offset
) % crypto_sync_skcipher_blocksize(tfm
) != 0);
539 skcipher_request_set_sync_tfm(req
, tfm
);
540 skcipher_request_set_callback(req
, 0, NULL
, NULL
);
542 memset(desc
.iv
, 0, sizeof(desc
.iv
));
547 sg_init_table(desc
.frags
, 4);
549 ret
= xdr_process_buf(buf
, offset
, buf
->len
- offset
, decryptor
, &desc
);
550 skcipher_request_zero(req
);
555 * This function makes the assumption that it was ultimately called
558 * The client auth_gss code moves any existing tail data into a
559 * separate page before calling gss_wrap.
560 * The server svcauth_gss code ensures that both the head and the
561 * tail have slack space of RPC_MAX_AUTH_SIZE before calling gss_wrap.
563 * Even with that guarantee, this function may be called more than
564 * once in the processing of gss_wrap(). The best we can do is
565 * verify at compile-time (see GSS_KRB5_SLACK_CHECK) that the
566 * largest expected shift will fit within RPC_MAX_AUTH_SIZE.
567 * At run-time we can verify that a single invocation of this
568 * function doesn't attempt to use more the RPC_MAX_AUTH_SIZE.
572 xdr_extend_head(struct xdr_buf
*buf
, unsigned int base
, unsigned int shiftlen
)
579 BUG_ON(shiftlen
> RPC_MAX_AUTH_SIZE
);
581 p
= buf
->head
[0].iov_base
+ base
;
583 memmove(p
+ shiftlen
, p
, buf
->head
[0].iov_len
- base
);
585 buf
->head
[0].iov_len
+= shiftlen
;
586 buf
->len
+= shiftlen
;
592 gss_krb5_cts_crypt(struct crypto_sync_skcipher
*cipher
, struct xdr_buf
*buf
,
593 u32 offset
, u8
*iv
, struct page
**pages
, int encrypt
)
596 struct scatterlist sg
[1];
597 SYNC_SKCIPHER_REQUEST_ON_STACK(req
, cipher
);
599 struct page
**save_pages
;
600 u32 len
= buf
->len
- offset
;
602 if (len
> GSS_KRB5_MAX_BLOCKSIZE
* 2) {
606 data
= kmalloc(GSS_KRB5_MAX_BLOCKSIZE
* 2, GFP_KERNEL
);
611 * For encryption, we want to read from the cleartext
612 * page cache pages, and write the encrypted data to
613 * the supplied xdr_buf pages.
615 save_pages
= buf
->pages
;
619 ret
= read_bytes_from_xdr_buf(buf
, offset
, data
, len
);
620 buf
->pages
= save_pages
;
624 sg_init_one(sg
, data
, len
);
626 skcipher_request_set_sync_tfm(req
, cipher
);
627 skcipher_request_set_callback(req
, 0, NULL
, NULL
);
628 skcipher_request_set_crypt(req
, sg
, sg
, len
, iv
);
631 ret
= crypto_skcipher_encrypt(req
);
633 ret
= crypto_skcipher_decrypt(req
);
635 skcipher_request_zero(req
);
640 ret
= write_bytes_to_xdr_buf(buf
, offset
, data
, len
);
642 #if IS_ENABLED(CONFIG_KUNIT)
644 * CBC-CTS does not define an output IV but RFC 3962 defines it as the
645 * penultimate block of ciphertext, so copy that into the IV buffer
649 memcpy(iv
, data
, crypto_sync_skcipher_ivsize(cipher
));
658 * krb5_cbc_cts_encrypt - encrypt in CBC mode with CTS
659 * @cts_tfm: CBC cipher with CTS
660 * @cbc_tfm: base CBC cipher
661 * @offset: starting byte offset for plaintext
662 * @buf: OUT: output buffer
664 * @iv: output CBC initialization vector, or NULL
665 * @ivsize: size of @iv, in octets
667 * To provide confidentiality, encrypt using cipher block chaining
668 * with ciphertext stealing. Message integrity is handled separately.
671 * %0: encryption successful
672 * negative errno: encryption could not be completed
675 int krb5_cbc_cts_encrypt(struct crypto_sync_skcipher
*cts_tfm
,
676 struct crypto_sync_skcipher
*cbc_tfm
,
677 u32 offset
, struct xdr_buf
*buf
, struct page
**pages
,
678 u8
*iv
, unsigned int ivsize
)
680 u32 blocksize
, nbytes
, nblocks
, cbcbytes
;
681 struct encryptor_desc desc
;
684 blocksize
= crypto_sync_skcipher_blocksize(cts_tfm
);
685 nbytes
= buf
->len
- offset
;
686 nblocks
= (nbytes
+ blocksize
- 1) / blocksize
;
689 cbcbytes
= (nblocks
- 2) * blocksize
;
691 memset(desc
.iv
, 0, sizeof(desc
.iv
));
693 /* Handle block-sized chunks of plaintext with CBC. */
695 SYNC_SKCIPHER_REQUEST_ON_STACK(req
, cbc_tfm
);
704 skcipher_request_set_sync_tfm(req
, cbc_tfm
);
705 skcipher_request_set_callback(req
, 0, NULL
, NULL
);
707 sg_init_table(desc
.infrags
, 4);
708 sg_init_table(desc
.outfrags
, 4);
710 err
= xdr_process_buf(buf
, offset
, cbcbytes
, encryptor
, &desc
);
711 skcipher_request_zero(req
);
716 /* Remaining plaintext is handled with CBC-CTS. */
717 err
= gss_krb5_cts_crypt(cts_tfm
, buf
, offset
+ cbcbytes
,
723 memcpy(iv
, desc
.iv
, ivsize
);
726 EXPORT_SYMBOL_IF_KUNIT(krb5_cbc_cts_encrypt
);
729 * krb5_cbc_cts_decrypt - decrypt in CBC mode with CTS
730 * @cts_tfm: CBC cipher with CTS
731 * @cbc_tfm: base CBC cipher
732 * @offset: starting byte offset for plaintext
733 * @buf: OUT: output buffer
736 * %0: decryption successful
737 * negative errno: decryption could not be completed
740 int krb5_cbc_cts_decrypt(struct crypto_sync_skcipher
*cts_tfm
,
741 struct crypto_sync_skcipher
*cbc_tfm
,
742 u32 offset
, struct xdr_buf
*buf
)
744 u32 blocksize
, nblocks
, cbcbytes
;
745 struct decryptor_desc desc
;
748 blocksize
= crypto_sync_skcipher_blocksize(cts_tfm
);
749 nblocks
= (buf
->len
+ blocksize
- 1) / blocksize
;
752 cbcbytes
= (nblocks
- 2) * blocksize
;
754 memset(desc
.iv
, 0, sizeof(desc
.iv
));
756 /* Handle block-sized chunks of plaintext with CBC. */
758 SYNC_SKCIPHER_REQUEST_ON_STACK(req
, cbc_tfm
);
764 skcipher_request_set_sync_tfm(req
, cbc_tfm
);
765 skcipher_request_set_callback(req
, 0, NULL
, NULL
);
767 sg_init_table(desc
.frags
, 4);
769 err
= xdr_process_buf(buf
, 0, cbcbytes
, decryptor
, &desc
);
770 skcipher_request_zero(req
);
775 /* Remaining plaintext is handled with CBC-CTS. */
776 return gss_krb5_cts_crypt(cts_tfm
, buf
, cbcbytes
, desc
.iv
, NULL
, 0);
778 EXPORT_SYMBOL_IF_KUNIT(krb5_cbc_cts_decrypt
);
781 gss_krb5_aes_encrypt(struct krb5_ctx
*kctx
, u32 offset
,
782 struct xdr_buf
*buf
, struct page
**pages
)
785 struct xdr_netobj hmac
;
787 struct crypto_sync_skcipher
*cipher
, *aux_cipher
;
788 struct crypto_ahash
*ahash
;
789 struct page
**save_pages
;
790 unsigned int conflen
;
792 if (kctx
->initiate
) {
793 cipher
= kctx
->initiator_enc
;
794 aux_cipher
= kctx
->initiator_enc_aux
;
795 ahash
= kctx
->initiator_integ
;
797 cipher
= kctx
->acceptor_enc
;
798 aux_cipher
= kctx
->acceptor_enc_aux
;
799 ahash
= kctx
->acceptor_integ
;
801 conflen
= crypto_sync_skcipher_blocksize(cipher
);
803 /* hide the gss token header and insert the confounder */
804 offset
+= GSS_KRB5_TOK_HDR_LEN
;
805 if (xdr_extend_head(buf
, offset
, conflen
))
806 return GSS_S_FAILURE
;
807 krb5_make_confounder(buf
->head
[0].iov_base
+ offset
, conflen
);
808 offset
-= GSS_KRB5_TOK_HDR_LEN
;
810 if (buf
->tail
[0].iov_base
!= NULL
) {
811 ecptr
= buf
->tail
[0].iov_base
+ buf
->tail
[0].iov_len
;
813 buf
->tail
[0].iov_base
= buf
->head
[0].iov_base
814 + buf
->head
[0].iov_len
;
815 buf
->tail
[0].iov_len
= 0;
816 ecptr
= buf
->tail
[0].iov_base
;
819 /* copy plaintext gss token header after filler (if any) */
820 memcpy(ecptr
, buf
->head
[0].iov_base
+ offset
, GSS_KRB5_TOK_HDR_LEN
);
821 buf
->tail
[0].iov_len
+= GSS_KRB5_TOK_HDR_LEN
;
822 buf
->len
+= GSS_KRB5_TOK_HDR_LEN
;
824 hmac
.len
= kctx
->gk5e
->cksumlength
;
825 hmac
.data
= buf
->tail
[0].iov_base
+ buf
->tail
[0].iov_len
;
828 * When we are called, pages points to the real page cache
829 * data -- which we can't go and encrypt! buf->pages points
830 * to scratch pages which we are going to send off to the
831 * client/server. Swap in the plaintext pages to calculate
834 save_pages
= buf
->pages
;
837 err
= gss_krb5_checksum(ahash
, NULL
, 0, buf
,
838 offset
+ GSS_KRB5_TOK_HDR_LEN
, &hmac
);
839 buf
->pages
= save_pages
;
841 return GSS_S_FAILURE
;
843 err
= krb5_cbc_cts_encrypt(cipher
, aux_cipher
,
844 offset
+ GSS_KRB5_TOK_HDR_LEN
,
845 buf
, pages
, NULL
, 0);
847 return GSS_S_FAILURE
;
849 /* Now update buf to account for HMAC */
850 buf
->tail
[0].iov_len
+= kctx
->gk5e
->cksumlength
;
851 buf
->len
+= kctx
->gk5e
->cksumlength
;
853 return GSS_S_COMPLETE
;
857 gss_krb5_aes_decrypt(struct krb5_ctx
*kctx
, u32 offset
, u32 len
,
858 struct xdr_buf
*buf
, u32
*headskip
, u32
*tailskip
)
860 struct crypto_sync_skcipher
*cipher
, *aux_cipher
;
861 struct crypto_ahash
*ahash
;
862 struct xdr_netobj our_hmac_obj
;
863 u8 our_hmac
[GSS_KRB5_MAX_CKSUM_LEN
];
864 u8 pkt_hmac
[GSS_KRB5_MAX_CKSUM_LEN
];
865 struct xdr_buf subbuf
;
868 if (kctx
->initiate
) {
869 cipher
= kctx
->acceptor_enc
;
870 aux_cipher
= kctx
->acceptor_enc_aux
;
871 ahash
= kctx
->acceptor_integ
;
873 cipher
= kctx
->initiator_enc
;
874 aux_cipher
= kctx
->initiator_enc_aux
;
875 ahash
= kctx
->initiator_integ
;
878 /* create a segment skipping the header and leaving out the checksum */
879 xdr_buf_subsegment(buf
, &subbuf
, offset
+ GSS_KRB5_TOK_HDR_LEN
,
880 (len
- offset
- GSS_KRB5_TOK_HDR_LEN
-
881 kctx
->gk5e
->cksumlength
));
883 ret
= krb5_cbc_cts_decrypt(cipher
, aux_cipher
, 0, &subbuf
);
887 our_hmac_obj
.len
= kctx
->gk5e
->cksumlength
;
888 our_hmac_obj
.data
= our_hmac
;
889 ret
= gss_krb5_checksum(ahash
, NULL
, 0, &subbuf
, 0, &our_hmac_obj
);
893 /* Get the packet's hmac value */
894 ret
= read_bytes_from_xdr_buf(buf
, len
- kctx
->gk5e
->cksumlength
,
895 pkt_hmac
, kctx
->gk5e
->cksumlength
);
899 if (crypto_memneq(pkt_hmac
, our_hmac
, kctx
->gk5e
->cksumlength
) != 0) {
903 *headskip
= crypto_sync_skcipher_blocksize(cipher
);
904 *tailskip
= kctx
->gk5e
->cksumlength
;
906 if (ret
&& ret
!= GSS_S_BAD_SIG
)
912 * krb5_etm_checksum - Compute a MAC for a GSS Wrap token
913 * @cipher: an initialized cipher transform
914 * @tfm: an initialized hash transform
915 * @body: xdr_buf containing an RPC message (body.len is the message length)
916 * @body_offset: byte offset into @body to start checksumming
917 * @cksumout: OUT: a buffer to be filled in with the computed HMAC
919 * Usually expressed as H = HMAC(K, IV | ciphertext)[1..h] .
921 * Caller provides the truncation length of the output token (h) in
925 * %GSS_S_COMPLETE: Digest computed, @cksumout filled in
926 * %GSS_S_FAILURE: Call failed
929 u32
krb5_etm_checksum(struct crypto_sync_skcipher
*cipher
,
930 struct crypto_ahash
*tfm
, const struct xdr_buf
*body
,
931 int body_offset
, struct xdr_netobj
*cksumout
)
933 unsigned int ivsize
= crypto_sync_skcipher_ivsize(cipher
);
934 struct ahash_request
*req
;
935 struct scatterlist sg
[1];
936 u8
*iv
, *checksumdata
;
939 checksumdata
= kmalloc(crypto_ahash_digestsize(tfm
), GFP_KERNEL
);
941 return GSS_S_FAILURE
;
942 /* For RPCSEC, the "initial cipher state" is always all zeroes. */
943 iv
= kzalloc(ivsize
, GFP_KERNEL
);
947 req
= ahash_request_alloc(tfm
, GFP_KERNEL
);
950 ahash_request_set_callback(req
, CRYPTO_TFM_REQ_MAY_SLEEP
, NULL
, NULL
);
951 err
= crypto_ahash_init(req
);
955 sg_init_one(sg
, iv
, ivsize
);
956 ahash_request_set_crypt(req
, sg
, NULL
, ivsize
);
957 err
= crypto_ahash_update(req
);
960 err
= xdr_process_buf(body
, body_offset
, body
->len
- body_offset
,
965 ahash_request_set_crypt(req
, NULL
, checksumdata
, 0);
966 err
= crypto_ahash_final(req
);
969 memcpy(cksumout
->data
, checksumdata
, cksumout
->len
);
972 ahash_request_free(req
);
975 kfree_sensitive(checksumdata
);
976 return err
? GSS_S_FAILURE
: GSS_S_COMPLETE
;
978 EXPORT_SYMBOL_IF_KUNIT(krb5_etm_checksum
);
981 * krb5_etm_encrypt - Encrypt using the RFC 8009 rules
982 * @kctx: Kerberos context
983 * @offset: starting offset of the payload, in bytes
984 * @buf: OUT: send buffer to contain the encrypted payload
985 * @pages: plaintext payload
987 * The main difference with aes_encrypt is that "The HMAC is
988 * calculated over the cipher state concatenated with the AES
989 * output, instead of being calculated over the confounder and
990 * plaintext. This allows the message receiver to verify the
991 * integrity of the message before decrypting the message."
993 * RFC 8009 Section 5:
995 * encryption function: as follows, where E() is AES encryption in
996 * CBC-CS3 mode, and h is the size of truncated HMAC (128 bits or
997 * 192 bits as described above).
999 * N = random value of length 128 bits (the AES block size)
1001 * C = E(Ke, N | plaintext, IV)
1002 * H = HMAC(Ki, IV | C)
1003 * ciphertext = C | H[1..h]
1005 * This encryption formula provides AEAD EtM with key separation.
1008 * %GSS_S_COMPLETE: Encryption successful
1009 * %GSS_S_FAILURE: Encryption failed
1012 krb5_etm_encrypt(struct krb5_ctx
*kctx
, u32 offset
,
1013 struct xdr_buf
*buf
, struct page
**pages
)
1015 struct crypto_sync_skcipher
*cipher
, *aux_cipher
;
1016 struct crypto_ahash
*ahash
;
1017 struct xdr_netobj hmac
;
1018 unsigned int conflen
;
1022 if (kctx
->initiate
) {
1023 cipher
= kctx
->initiator_enc
;
1024 aux_cipher
= kctx
->initiator_enc_aux
;
1025 ahash
= kctx
->initiator_integ
;
1027 cipher
= kctx
->acceptor_enc
;
1028 aux_cipher
= kctx
->acceptor_enc_aux
;
1029 ahash
= kctx
->acceptor_integ
;
1031 conflen
= crypto_sync_skcipher_blocksize(cipher
);
1033 offset
+= GSS_KRB5_TOK_HDR_LEN
;
1034 if (xdr_extend_head(buf
, offset
, conflen
))
1035 return GSS_S_FAILURE
;
1036 krb5_make_confounder(buf
->head
[0].iov_base
+ offset
, conflen
);
1037 offset
-= GSS_KRB5_TOK_HDR_LEN
;
1039 if (buf
->tail
[0].iov_base
) {
1040 ecptr
= buf
->tail
[0].iov_base
+ buf
->tail
[0].iov_len
;
1042 buf
->tail
[0].iov_base
= buf
->head
[0].iov_base
1043 + buf
->head
[0].iov_len
;
1044 buf
->tail
[0].iov_len
= 0;
1045 ecptr
= buf
->tail
[0].iov_base
;
1048 memcpy(ecptr
, buf
->head
[0].iov_base
+ offset
, GSS_KRB5_TOK_HDR_LEN
);
1049 buf
->tail
[0].iov_len
+= GSS_KRB5_TOK_HDR_LEN
;
1050 buf
->len
+= GSS_KRB5_TOK_HDR_LEN
;
1052 err
= krb5_cbc_cts_encrypt(cipher
, aux_cipher
,
1053 offset
+ GSS_KRB5_TOK_HDR_LEN
,
1054 buf
, pages
, NULL
, 0);
1056 return GSS_S_FAILURE
;
1058 hmac
.data
= buf
->tail
[0].iov_base
+ buf
->tail
[0].iov_len
;
1059 hmac
.len
= kctx
->gk5e
->cksumlength
;
1060 err
= krb5_etm_checksum(cipher
, ahash
,
1061 buf
, offset
+ GSS_KRB5_TOK_HDR_LEN
, &hmac
);
1064 buf
->tail
[0].iov_len
+= kctx
->gk5e
->cksumlength
;
1065 buf
->len
+= kctx
->gk5e
->cksumlength
;
1067 return GSS_S_COMPLETE
;
1070 return GSS_S_FAILURE
;
1074 * krb5_etm_decrypt - Decrypt using the RFC 8009 rules
1075 * @kctx: Kerberos context
1076 * @offset: starting offset of the ciphertext, in bytes
1079 * @headskip: OUT: the enctype's confounder length, in octets
1080 * @tailskip: OUT: the enctype's HMAC length, in octets
1082 * RFC 8009 Section 5:
1084 * decryption function: as follows, where D() is AES decryption in
1085 * CBC-CS3 mode, and h is the size of truncated HMAC.
1087 * (C, H) = ciphertext
1088 * (Note: H is the last h bits of the ciphertext.)
1090 * if H != HMAC(Ki, IV | C)[1..h]
1091 * stop, report error
1092 * (N, P) = D(Ke, C, IV)
1095 * %GSS_S_COMPLETE: Decryption successful
1096 * %GSS_S_BAD_SIG: computed HMAC != received HMAC
1097 * %GSS_S_FAILURE: Decryption failed
1100 krb5_etm_decrypt(struct krb5_ctx
*kctx
, u32 offset
, u32 len
,
1101 struct xdr_buf
*buf
, u32
*headskip
, u32
*tailskip
)
1103 struct crypto_sync_skcipher
*cipher
, *aux_cipher
;
1104 u8 our_hmac
[GSS_KRB5_MAX_CKSUM_LEN
];
1105 u8 pkt_hmac
[GSS_KRB5_MAX_CKSUM_LEN
];
1106 struct xdr_netobj our_hmac_obj
;
1107 struct crypto_ahash
*ahash
;
1108 struct xdr_buf subbuf
;
1111 if (kctx
->initiate
) {
1112 cipher
= kctx
->acceptor_enc
;
1113 aux_cipher
= kctx
->acceptor_enc_aux
;
1114 ahash
= kctx
->acceptor_integ
;
1116 cipher
= kctx
->initiator_enc
;
1117 aux_cipher
= kctx
->initiator_enc_aux
;
1118 ahash
= kctx
->initiator_integ
;
1121 /* Extract the ciphertext into @subbuf. */
1122 xdr_buf_subsegment(buf
, &subbuf
, offset
+ GSS_KRB5_TOK_HDR_LEN
,
1123 (len
- offset
- GSS_KRB5_TOK_HDR_LEN
-
1124 kctx
->gk5e
->cksumlength
));
1126 our_hmac_obj
.data
= our_hmac
;
1127 our_hmac_obj
.len
= kctx
->gk5e
->cksumlength
;
1128 ret
= krb5_etm_checksum(cipher
, ahash
, &subbuf
, 0, &our_hmac_obj
);
1131 ret
= read_bytes_from_xdr_buf(buf
, len
- kctx
->gk5e
->cksumlength
,
1132 pkt_hmac
, kctx
->gk5e
->cksumlength
);
1135 if (crypto_memneq(pkt_hmac
, our_hmac
, kctx
->gk5e
->cksumlength
) != 0) {
1136 ret
= GSS_S_BAD_SIG
;
1140 ret
= krb5_cbc_cts_decrypt(cipher
, aux_cipher
, 0, &subbuf
);
1142 ret
= GSS_S_FAILURE
;
1146 *headskip
= crypto_sync_skcipher_blocksize(cipher
);
1147 *tailskip
= kctx
->gk5e
->cksumlength
;
1148 return GSS_S_COMPLETE
;
1151 if (ret
!= GSS_S_BAD_SIG
)
1152 ret
= GSS_S_FAILURE
;