2020-01-21 16:56:20 -08:00
// SPDX-License-Identifier: GPL-2.0
/* Multipath TCP cryptographic functions
* Copyright ( c ) 2017 - 2019 , Intel Corporation .
*
* Note : This code is based on mptcp_ctrl . c , mptcp_ipv4 . c , and
* mptcp_ipv6 from multipath - tcp . org , authored by :
*
* Sébastien Barré < sebastien . barre @ uclouvain . be >
* Christoph Paasch < christoph . paasch @ uclouvain . be >
* Jaakko Korkeaniemi < jaakko . korkeaniemi @ aalto . fi >
* Gregory Detal < gregory . detal @ uclouvain . be >
* Fabien Duchêne < fabien . duchene @ uclouvain . be >
* Andreas Seelinger < Andreas . Seelinger @ rwth - aachen . de >
* Lavkesh Lahngir < lavkesh51 @ gmail . com >
* Andreas Ripke < ripke @ neclab . eu >
* Vlad Dogaru < vlad . dogaru @ intel . com >
* Octavian Purdila < octavian . purdila @ intel . com >
* John Ronan < jronan @ tssg . org >
* Catalin Nicutar < catalin . nicutar @ gmail . com >
* Brandon Heller < brandonh @ stanford . edu >
*/
# include <linux/kernel.h>
2020-11-12 21:20:21 -08:00
# include <crypto/sha2.h>
2020-01-21 16:56:20 -08:00
# include <asm/unaligned.h>
# include "protocol.h"
2020-01-21 16:56:30 -08:00
# define SHA256_DIGEST_WORDS (SHA256_DIGEST_SIZE / 4)
2020-01-21 16:56:20 -08:00
void mptcp_crypto_key_sha ( u64 key , u32 * token , u64 * idsn )
{
2020-01-21 16:56:30 -08:00
__be32 mptcp_hashed_key [ SHA256_DIGEST_WORDS ] ;
__be64 input = cpu_to_be64 ( key ) ;
2020-01-21 16:56:20 -08:00
2020-07-08 09:39:42 -07:00
sha256 ( ( __force u8 * ) & input , sizeof ( input ) , ( u8 * ) mptcp_hashed_key ) ;
2020-01-21 16:56:20 -08:00
if ( token )
* token = be32_to_cpu ( mptcp_hashed_key [ 0 ] ) ;
if ( idsn )
2020-01-21 16:56:30 -08:00
* idsn = be64_to_cpu ( * ( ( __be64 * ) & mptcp_hashed_key [ 6 ] ) ) ;
2020-01-21 16:56:20 -08:00
}
2020-03-27 14:48:37 -07:00
void mptcp_crypto_hmac_sha ( u64 key1 , u64 key2 , u8 * msg , int len , void * hmac )
2020-01-21 16:56:20 -08:00
{
2020-01-21 16:56:30 -08:00
u8 input [ SHA256_BLOCK_SIZE + SHA256_DIGEST_SIZE ] ;
2020-01-21 16:56:20 -08:00
u8 key1be [ 8 ] ;
u8 key2be [ 8 ] ;
int i ;
2020-03-27 14:48:37 -07:00
if ( WARN_ON_ONCE ( len > SHA256_DIGEST_SIZE ) )
len = SHA256_DIGEST_SIZE ;
2020-01-21 16:56:20 -08:00
put_unaligned_be64 ( key1 , key1be ) ;
put_unaligned_be64 ( key2 , key2be ) ;
/* Generate key xored with ipad */
2020-05-02 11:24:21 -07:00
memset ( input , 0x36 , SHA256_BLOCK_SIZE ) ;
2020-01-21 16:56:20 -08:00
for ( i = 0 ; i < 8 ; i + + )
input [ i ] ^ = key1be [ i ] ;
for ( i = 0 ; i < 8 ; i + + )
input [ i + 8 ] ^ = key2be [ i ] ;
2020-03-27 14:48:37 -07:00
memcpy ( & input [ SHA256_BLOCK_SIZE ] , msg , len ) ;
2020-01-21 16:56:20 -08:00
/* emit sha256(K1 || msg) on the second input block, so we can
* reuse ' input ' for the last hashing
*/
2020-07-08 09:39:42 -07:00
sha256 ( input , SHA256_BLOCK_SIZE + len , & input [ SHA256_BLOCK_SIZE ] ) ;
2020-01-21 16:56:20 -08:00
/* Prepare second part of hmac */
2020-05-02 11:24:21 -07:00
memset ( input , 0x5C , SHA256_BLOCK_SIZE ) ;
2020-01-21 16:56:20 -08:00
for ( i = 0 ; i < 8 ; i + + )
input [ i ] ^ = key1be [ i ] ;
for ( i = 0 ; i < 8 ; i + + )
input [ i + 8 ] ^ = key2be [ i ] ;
2020-07-08 09:39:42 -07:00
sha256 ( input , SHA256_BLOCK_SIZE + SHA256_DIGEST_SIZE , hmac ) ;
2020-01-21 16:56:30 -08:00
}
2021-04-16 15:38:01 -07:00
# if IS_MODULE(CONFIG_MPTCP_KUNIT_TEST)
2020-06-26 19:30:01 +02:00
EXPORT_SYMBOL_GPL ( mptcp_crypto_hmac_sha ) ;
2020-01-21 16:56:30 -08:00
# endif