rxkad.c (75bf465f0bc33e9b776a46d6a1b9b990f5fb7c37) rxkad.c (d0d5c0cd1e711c98703f3544c1e6fc1372898de5)
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

--- 173 unchanged lines hidden (view full) ---

182 void *sechdr,
183 struct skcipher_request *req)
184{
185 const struct rxrpc_key_token *token;
186 struct rxkad_level2_hdr rxkhdr;
187 struct rxrpc_skb_priv *sp;
188 struct rxrpc_crypt iv;
189 struct scatterlist sg[16];
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

--- 173 unchanged lines hidden (view full) ---

182 void *sechdr,
183 struct skcipher_request *req)
184{
185 const struct rxrpc_key_token *token;
186 struct rxkad_level2_hdr rxkhdr;
187 struct rxrpc_skb_priv *sp;
188 struct rxrpc_crypt iv;
189 struct scatterlist sg[16];
190 struct sk_buff *trailer;
191 unsigned int len;
192 u16 check;
190 unsigned int len;
191 u16 check;
193 int nsg;
194 int err;
195
196 sp = rxrpc_skb(skb);
197
198 _enter("");
199
200 check = sp->hdr.seq ^ call->call_id;
201

--- 7 unchanged lines hidden (view full) ---

209
210 sg_init_one(&sg[0], sechdr, sizeof(rxkhdr));
211 skcipher_request_set_sync_tfm(req, call->conn->cipher);
212 skcipher_request_set_callback(req, 0, NULL, NULL);
213 skcipher_request_set_crypt(req, &sg[0], &sg[0], sizeof(rxkhdr), iv.x);
214 crypto_skcipher_encrypt(req);
215
216 /* we want to encrypt the skbuff in-place */
192 int err;
193
194 sp = rxrpc_skb(skb);
195
196 _enter("");
197
198 check = sp->hdr.seq ^ call->call_id;
199

--- 7 unchanged lines hidden (view full) ---

207
208 sg_init_one(&sg[0], sechdr, sizeof(rxkhdr));
209 skcipher_request_set_sync_tfm(req, call->conn->cipher);
210 skcipher_request_set_callback(req, 0, NULL, NULL);
211 skcipher_request_set_crypt(req, &sg[0], &sg[0], sizeof(rxkhdr), iv.x);
212 crypto_skcipher_encrypt(req);
213
214 /* we want to encrypt the skbuff in-place */
217 nsg = skb_cow_data(skb, 0, &trailer);
218 err = -ENOMEM;
219 if (nsg < 0 || nsg > 16)
215 err = -EMSGSIZE;
216 if (skb_shinfo(skb)->nr_frags > 16)
220 goto out;
221
222 len = data_size + call->conn->size_align - 1;
223 len &= ~(call->conn->size_align - 1);
224
217 goto out;
218
219 len = data_size + call->conn->size_align - 1;
220 len &= ~(call->conn->size_align - 1);
221
225 sg_init_table(sg, nsg);
222 sg_init_table(sg, ARRAY_SIZE(sg));
226 err = skb_to_sgvec(skb, sg, 0, len);
227 if (unlikely(err < 0))
228 goto out;
229 skcipher_request_set_crypt(req, sg, sg, len, iv.x);
230 crypto_skcipher_encrypt(req);
231
232 _leave(" = 0");
233 err = 0;

--- 80 unchanged lines hidden (view full) ---

314static int rxkad_verify_packet_1(struct rxrpc_call *call, struct sk_buff *skb,
315 unsigned int offset, unsigned int len,
316 rxrpc_seq_t seq,
317 struct skcipher_request *req)
318{
319 struct rxkad_level1_hdr sechdr;
320 struct rxrpc_crypt iv;
321 struct scatterlist sg[16];
223 err = skb_to_sgvec(skb, sg, 0, len);
224 if (unlikely(err < 0))
225 goto out;
226 skcipher_request_set_crypt(req, sg, sg, len, iv.x);
227 crypto_skcipher_encrypt(req);
228
229 _leave(" = 0");
230 err = 0;

--- 80 unchanged lines hidden (view full) ---

311static int rxkad_verify_packet_1(struct rxrpc_call *call, struct sk_buff *skb,
312 unsigned int offset, unsigned int len,
313 rxrpc_seq_t seq,
314 struct skcipher_request *req)
315{
316 struct rxkad_level1_hdr sechdr;
317 struct rxrpc_crypt iv;
318 struct scatterlist sg[16];
322 struct sk_buff *trailer;
323 bool aborted;
324 u32 data_size, buf;
325 u16 check;
319 bool aborted;
320 u32 data_size, buf;
321 u16 check;
326 int nsg, ret;
322 int ret;
327
328 _enter("");
329
330 if (len < 8) {
331 aborted = rxrpc_abort_eproto(call, skb, "rxkad_1_hdr", "V1H",
332 RXKADSEALEDINCON);
333 goto protocol_error;
334 }
335
336 /* Decrypt the skbuff in-place. TODO: We really want to decrypt
337 * directly into the target buffer.
338 */
323
324 _enter("");
325
326 if (len < 8) {
327 aborted = rxrpc_abort_eproto(call, skb, "rxkad_1_hdr", "V1H",
328 RXKADSEALEDINCON);
329 goto protocol_error;
330 }
331
332 /* Decrypt the skbuff in-place. TODO: We really want to decrypt
333 * directly into the target buffer.
334 */
339 nsg = skb_cow_data(skb, 0, &trailer);
340 if (nsg < 0 || nsg > 16)
341 goto nomem;
342
343 sg_init_table(sg, nsg);
335 sg_init_table(sg, ARRAY_SIZE(sg));
344 ret = skb_to_sgvec(skb, sg, offset, 8);
345 if (unlikely(ret < 0))
346 return ret;
347
348 /* start the decryption afresh */
349 memset(&iv, 0, sizeof(iv));
350
351 skcipher_request_set_sync_tfm(req, call->conn->cipher);

--- 31 unchanged lines hidden (view full) ---

383
384 _leave(" = 0 [dlen=%x]", data_size);
385 return 0;
386
387protocol_error:
388 if (aborted)
389 rxrpc_send_abort_packet(call);
390 return -EPROTO;
336 ret = skb_to_sgvec(skb, sg, offset, 8);
337 if (unlikely(ret < 0))
338 return ret;
339
340 /* start the decryption afresh */
341 memset(&iv, 0, sizeof(iv));
342
343 skcipher_request_set_sync_tfm(req, call->conn->cipher);

--- 31 unchanged lines hidden (view full) ---

375
376 _leave(" = 0 [dlen=%x]", data_size);
377 return 0;
378
379protocol_error:
380 if (aborted)
381 rxrpc_send_abort_packet(call);
382 return -EPROTO;
391
392nomem:
393 _leave(" = -ENOMEM");
394 return -ENOMEM;
395}
396
397/*
398 * wholly decrypt a packet (level 2 security)
399 */
400static int rxkad_verify_packet_2(struct rxrpc_call *call, struct sk_buff *skb,
401 unsigned int offset, unsigned int len,
402 rxrpc_seq_t seq,
403 struct skcipher_request *req)
404{
405 const struct rxrpc_key_token *token;
406 struct rxkad_level2_hdr sechdr;
407 struct rxrpc_crypt iv;
408 struct scatterlist _sg[4], *sg;
383}
384
385/*
386 * wholly decrypt a packet (level 2 security)
387 */
388static int rxkad_verify_packet_2(struct rxrpc_call *call, struct sk_buff *skb,
389 unsigned int offset, unsigned int len,
390 rxrpc_seq_t seq,
391 struct skcipher_request *req)
392{
393 const struct rxrpc_key_token *token;
394 struct rxkad_level2_hdr sechdr;
395 struct rxrpc_crypt iv;
396 struct scatterlist _sg[4], *sg;
409 struct sk_buff *trailer;
410 bool aborted;
411 u32 data_size, buf;
412 u16 check;
413 int nsg, ret;
414
415 _enter(",{%d}", skb->len);
416
417 if (len < 8) {
418 aborted = rxrpc_abort_eproto(call, skb, "rxkad_2_hdr", "V2H",
419 RXKADSEALEDINCON);
420 goto protocol_error;
421 }
422
423 /* Decrypt the skbuff in-place. TODO: We really want to decrypt
424 * directly into the target buffer.
425 */
397 bool aborted;
398 u32 data_size, buf;
399 u16 check;
400 int nsg, ret;
401
402 _enter(",{%d}", skb->len);
403
404 if (len < 8) {
405 aborted = rxrpc_abort_eproto(call, skb, "rxkad_2_hdr", "V2H",
406 RXKADSEALEDINCON);
407 goto protocol_error;
408 }
409
410 /* Decrypt the skbuff in-place. TODO: We really want to decrypt
411 * directly into the target buffer.
412 */
426 nsg = skb_cow_data(skb, 0, &trailer);
427 if (nsg < 0)
428 goto nomem;
429
430 sg = _sg;
413 sg = _sg;
431 if (unlikely(nsg > 4)) {
414 nsg = skb_shinfo(skb)->nr_frags;
415 if (nsg <= 4) {
416 nsg = 4;
417 } else {
432 sg = kmalloc_array(nsg, sizeof(*sg), GFP_NOIO);
433 if (!sg)
434 goto nomem;
435 }
436
437 sg_init_table(sg, nsg);
438 ret = skb_to_sgvec(skb, sg, offset, len);
439 if (unlikely(ret < 0)) {

--- 818 unchanged lines hidden ---
418 sg = kmalloc_array(nsg, sizeof(*sg), GFP_NOIO);
419 if (!sg)
420 goto nomem;
421 }
422
423 sg_init_table(sg, nsg);
424 ret = skb_to_sgvec(skb, sg, offset, len);
425 if (unlikely(ret < 0)) {

--- 818 unchanged lines hidden ---