162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci#include <kunit/test.h> 362306a36Sopenharmony_ci 462306a36Sopenharmony_ci#include "protocol.h" 562306a36Sopenharmony_ci 662306a36Sopenharmony_cistruct test_case { 762306a36Sopenharmony_ci char *key; 862306a36Sopenharmony_ci char *msg; 962306a36Sopenharmony_ci char *result; 1062306a36Sopenharmony_ci}; 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci/* we can't reuse RFC 4231 test vectors, as we have constraint on the 1362306a36Sopenharmony_ci * input and key size. 1462306a36Sopenharmony_ci */ 1562306a36Sopenharmony_cistatic struct test_case tests[] = { 1662306a36Sopenharmony_ci { 1762306a36Sopenharmony_ci .key = "0b0b0b0b0b0b0b0b", 1862306a36Sopenharmony_ci .msg = "48692054", 1962306a36Sopenharmony_ci .result = "8385e24fb4235ac37556b6b886db106284a1da671699f46db1f235ec622dcafa", 2062306a36Sopenharmony_ci }, 2162306a36Sopenharmony_ci { 2262306a36Sopenharmony_ci .key = "aaaaaaaaaaaaaaaa", 2362306a36Sopenharmony_ci .msg = "dddddddd", 2462306a36Sopenharmony_ci .result = "2c5e219164ff1dca1c4a92318d847bb6b9d44492984e1eb71aff9022f71046e9", 2562306a36Sopenharmony_ci }, 2662306a36Sopenharmony_ci { 2762306a36Sopenharmony_ci .key = "0102030405060708", 2862306a36Sopenharmony_ci .msg = "cdcdcdcd", 2962306a36Sopenharmony_ci .result = "e73b9ba9969969cefb04aa0d6df18ec2fcc075b6f23b4d8c4da736a5dbbc6e7d", 3062306a36Sopenharmony_ci }, 3162306a36Sopenharmony_ci}; 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_cistatic void mptcp_crypto_test_basic(struct kunit *test) 3462306a36Sopenharmony_ci{ 3562306a36Sopenharmony_ci char hmac[32], hmac_hex[65]; 3662306a36Sopenharmony_ci u32 nonce1, nonce2; 3762306a36Sopenharmony_ci u64 key1, key2; 3862306a36Sopenharmony_ci u8 msg[8]; 3962306a36Sopenharmony_ci int i, j; 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_ci for (i = 0; i < ARRAY_SIZE(tests); ++i) { 4262306a36Sopenharmony_ci /* mptcp hmap will convert to be before computing the hmac */ 4362306a36Sopenharmony_ci key1 = be64_to_cpu(*((__be64 *)&tests[i].key[0])); 4462306a36Sopenharmony_ci key2 = be64_to_cpu(*((__be64 *)&tests[i].key[8])); 4562306a36Sopenharmony_ci nonce1 = be32_to_cpu(*((__be32 *)&tests[i].msg[0])); 4662306a36Sopenharmony_ci nonce2 = be32_to_cpu(*((__be32 *)&tests[i].msg[4])); 4762306a36Sopenharmony_ci 4862306a36Sopenharmony_ci put_unaligned_be32(nonce1, &msg[0]); 4962306a36Sopenharmony_ci put_unaligned_be32(nonce2, &msg[4]); 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_ci mptcp_crypto_hmac_sha(key1, key2, msg, 8, hmac); 5262306a36Sopenharmony_ci for (j = 0; j < 32; ++j) 5362306a36Sopenharmony_ci sprintf(&hmac_hex[j << 1], "%02x", hmac[j] & 0xff); 5462306a36Sopenharmony_ci hmac_hex[64] = 0; 5562306a36Sopenharmony_ci 5662306a36Sopenharmony_ci KUNIT_EXPECT_STREQ(test, &hmac_hex[0], tests[i].result); 5762306a36Sopenharmony_ci } 5862306a36Sopenharmony_ci} 5962306a36Sopenharmony_ci 6062306a36Sopenharmony_cistatic struct kunit_case mptcp_crypto_test_cases[] = { 6162306a36Sopenharmony_ci KUNIT_CASE(mptcp_crypto_test_basic), 6262306a36Sopenharmony_ci {} 6362306a36Sopenharmony_ci}; 6462306a36Sopenharmony_ci 6562306a36Sopenharmony_cistatic struct kunit_suite mptcp_crypto_suite = { 6662306a36Sopenharmony_ci .name = "mptcp-crypto", 6762306a36Sopenharmony_ci .test_cases = mptcp_crypto_test_cases, 6862306a36Sopenharmony_ci}; 6962306a36Sopenharmony_ci 7062306a36Sopenharmony_cikunit_test_suite(mptcp_crypto_suite); 7162306a36Sopenharmony_ci 7262306a36Sopenharmony_ciMODULE_LICENSE("GPL"); 73