Branch data Line data Source code
1 : : // SPDX-License-Identifier: GPL-2.0
2 : : /* Multipath TCP cryptographic functions
3 : : * Copyright (c) 2017 - 2019, Intel Corporation.
4 : : *
5 : : * Note: This code is based on mptcp_ctrl.c, mptcp_ipv4.c, and
6 : : * mptcp_ipv6 from multipath-tcp.org, authored by:
7 : : *
8 : : * Sébastien Barré <sebastien.barre@uclouvain.be>
9 : : * Christoph Paasch <christoph.paasch@uclouvain.be>
10 : : * Jaakko Korkeaniemi <jaakko.korkeaniemi@aalto.fi>
11 : : * Gregory Detal <gregory.detal@uclouvain.be>
12 : : * Fabien Duchêne <fabien.duchene@uclouvain.be>
13 : : * Andreas Seelinger <Andreas.Seelinger@rwth-aachen.de>
14 : : * Lavkesh Lahngir <lavkesh51@gmail.com>
15 : : * Andreas Ripke <ripke@neclab.eu>
16 : : * Vlad Dogaru <vlad.dogaru@intel.com>
17 : : * Octavian Purdila <octavian.purdila@intel.com>
18 : : * John Ronan <jronan@tssg.org>
19 : : * Catalin Nicutar <catalin.nicutar@gmail.com>
20 : : * Brandon Heller <brandonh@stanford.edu>
21 : : */
22 : :
23 : : #include <linux/kernel.h>
24 : : #include <crypto/sha2.h>
25 : : #include <linux/unaligned.h>
26 : :
27 : : #include "protocol.h"
28 : :
29 : : #define SHA256_DIGEST_WORDS (SHA256_DIGEST_SIZE / 4)
30 : :
31 : 5965 : void mptcp_crypto_key_sha(u64 key, u32 *token, u64 *idsn)
32 : : {
33 : 5965 : __be32 mptcp_hashed_key[SHA256_DIGEST_WORDS];
34 : 5965 : __be64 input = cpu_to_be64(key);
35 : :
36 : 5965 : sha256((__force u8 *)&input, sizeof(input), (u8 *)mptcp_hashed_key);
37 : :
38 [ + + ]: 5965 : if (token)
39 : 3046 : *token = be32_to_cpu(mptcp_hashed_key[0]);
40 [ + + ]: 5965 : if (idsn)
41 : 5405 : *idsn = be64_to_cpu(*((__be64 *)&mptcp_hashed_key[6]));
42 : 5965 : }
43 : :
44 : 2772 : void mptcp_crypto_hmac_sha(u64 key1, u64 key2, u8 *msg, int len, void *hmac)
45 : : {
46 : 2772 : u8 input[SHA256_BLOCK_SIZE + SHA256_DIGEST_SIZE];
47 : 2772 : u8 key1be[8];
48 : 2772 : u8 key2be[8];
49 : 2772 : int i;
50 : :
51 [ - + ]: 2772 : if (WARN_ON_ONCE(len > SHA256_DIGEST_SIZE))
52 : 0 : len = SHA256_DIGEST_SIZE;
53 : :
54 : 2772 : put_unaligned_be64(key1, key1be);
55 : 2772 : put_unaligned_be64(key2, key2be);
56 : :
57 : : /* Generate key xored with ipad */
58 : 2772 : memset(input, 0x36, SHA256_BLOCK_SIZE);
59 [ + + ]: 24948 : for (i = 0; i < 8; i++)
60 : 22176 : input[i] ^= key1be[i];
61 [ + + ]: 24948 : for (i = 0; i < 8; i++)
62 : 22176 : input[i + 8] ^= key2be[i];
63 : :
64 : 2772 : memcpy(&input[SHA256_BLOCK_SIZE], msg, len);
65 : :
66 : : /* emit sha256(K1 || msg) on the second input block, so we can
67 : : * reuse 'input' for the last hashing
68 : : */
69 : 2772 : sha256(input, SHA256_BLOCK_SIZE + len, &input[SHA256_BLOCK_SIZE]);
70 : :
71 : : /* Prepare second part of hmac */
72 : 2772 : memset(input, 0x5C, SHA256_BLOCK_SIZE);
73 [ + + ]: 24948 : for (i = 0; i < 8; i++)
74 : 22176 : input[i] ^= key1be[i];
75 [ + + ]: 24948 : for (i = 0; i < 8; i++)
76 : 22176 : input[i + 8] ^= key2be[i];
77 : :
78 : 2772 : sha256(input, SHA256_BLOCK_SIZE + SHA256_DIGEST_SIZE, hmac);
79 : 2772 : }
80 : :
81 : : #if IS_MODULE(CONFIG_MPTCP_KUNIT_TEST)
82 : : EXPORT_SYMBOL_GPL(mptcp_crypto_hmac_sha);
83 : : #endif
|