1eebd8c2dSChuck Lever // SPDX-License-Identifier: GPL-2.0 2eebd8c2dSChuck Lever /* 3eebd8c2dSChuck Lever * Copyright (c) 2022 Oracle and/or its affiliates. 4eebd8c2dSChuck Lever * 5eebd8c2dSChuck Lever * KUnit test of SunRPC's GSS Kerberos mechanism. Subsystem 6eebd8c2dSChuck Lever * name is "rpcsec_gss_krb5". 7eebd8c2dSChuck Lever */ 8eebd8c2dSChuck Lever 9eebd8c2dSChuck Lever #include <kunit/test.h> 10eebd8c2dSChuck Lever #include <kunit/visibility.h> 11eebd8c2dSChuck Lever 12eebd8c2dSChuck Lever #include <linux/kernel.h> 1302142b2cSChuck Lever #include <crypto/hash.h> 14eebd8c2dSChuck Lever 15eebd8c2dSChuck Lever #include <linux/sunrpc/xdr.h> 16eebd8c2dSChuck Lever #include <linux/sunrpc/gss_krb5.h> 17eebd8c2dSChuck Lever 18eebd8c2dSChuck Lever #include "gss_krb5_internal.h" 19eebd8c2dSChuck Lever 20eebd8c2dSChuck Lever MODULE_IMPORT_NS(EXPORTED_FOR_KUNIT_TESTING); 21eebd8c2dSChuck Lever 22eebd8c2dSChuck Lever struct gss_krb5_test_param { 23eebd8c2dSChuck Lever const char *desc; 246eb6b8a4SChuck Lever u32 enctype; 25eebd8c2dSChuck Lever u32 nfold; 26b958cff6SChuck Lever u32 constant; 276eb6b8a4SChuck Lever const struct xdr_netobj *base_key; 28e1a9a384SChuck Lever const struct xdr_netobj *Ke; 296eb6b8a4SChuck Lever const struct xdr_netobj *usage; 30eebd8c2dSChuck Lever const struct xdr_netobj *plaintext; 31b958cff6SChuck Lever const struct xdr_netobj *confounder; 32eebd8c2dSChuck Lever const struct xdr_netobj *expected_result; 334d2d15c0SChuck Lever const struct xdr_netobj *expected_hmac; 34e1a9a384SChuck Lever const struct xdr_netobj *next_iv; 35eebd8c2dSChuck Lever }; 36eebd8c2dSChuck Lever 37eebd8c2dSChuck Lever static inline void gss_krb5_get_desc(const struct gss_krb5_test_param *param, 38eebd8c2dSChuck Lever char *desc) 39eebd8c2dSChuck Lever { 40eebd8c2dSChuck Lever strscpy(desc, param->desc, KUNIT_PARAM_DESC_SIZE); 41eebd8c2dSChuck Lever } 42eebd8c2dSChuck Lever 436eb6b8a4SChuck Lever static void kdf_case(struct kunit *test) 446eb6b8a4SChuck Lever { 456eb6b8a4SChuck Lever const struct gss_krb5_test_param *param = test->param_value; 466eb6b8a4SChuck Lever const struct gss_krb5_enctype *gk5e; 476eb6b8a4SChuck Lever struct xdr_netobj derivedkey; 486eb6b8a4SChuck Lever int err; 496eb6b8a4SChuck Lever 506eb6b8a4SChuck Lever /* Arrange */ 516eb6b8a4SChuck Lever gk5e = gss_krb5_lookup_enctype(param->enctype); 52*fe90151cSChuck Lever if (!gk5e) 53*fe90151cSChuck Lever kunit_skip(test, "Encryption type is not available"); 546eb6b8a4SChuck Lever 556eb6b8a4SChuck Lever derivedkey.data = kunit_kzalloc(test, param->expected_result->len, 566eb6b8a4SChuck Lever GFP_KERNEL); 576eb6b8a4SChuck Lever KUNIT_ASSERT_NOT_ERR_OR_NULL(test, derivedkey.data); 586eb6b8a4SChuck Lever derivedkey.len = param->expected_result->len; 596eb6b8a4SChuck Lever 606eb6b8a4SChuck Lever /* Act */ 616eb6b8a4SChuck Lever err = gk5e->derive_key(gk5e, param->base_key, &derivedkey, 626eb6b8a4SChuck Lever param->usage, GFP_KERNEL); 636eb6b8a4SChuck Lever KUNIT_ASSERT_EQ(test, err, 0); 646eb6b8a4SChuck Lever 656eb6b8a4SChuck Lever /* Assert */ 666eb6b8a4SChuck Lever KUNIT_EXPECT_EQ_MSG(test, 676eb6b8a4SChuck Lever memcmp(param->expected_result->data, 686eb6b8a4SChuck Lever derivedkey.data, derivedkey.len), 0, 696eb6b8a4SChuck Lever "key mismatch"); 706eb6b8a4SChuck Lever } 716eb6b8a4SChuck Lever 7202142b2cSChuck Lever static void checksum_case(struct kunit *test) 7302142b2cSChuck Lever { 7402142b2cSChuck Lever const struct gss_krb5_test_param *param = test->param_value; 7502142b2cSChuck Lever struct xdr_buf buf = { 7602142b2cSChuck Lever .head[0].iov_base = param->plaintext->data, 7702142b2cSChuck Lever .head[0].iov_len = param->plaintext->len, 7802142b2cSChuck Lever .len = param->plaintext->len, 7902142b2cSChuck Lever }; 8002142b2cSChuck Lever const struct gss_krb5_enctype *gk5e; 8102142b2cSChuck Lever struct xdr_netobj Kc, checksum; 8202142b2cSChuck Lever struct crypto_ahash *tfm; 8302142b2cSChuck Lever int err; 8402142b2cSChuck Lever 8502142b2cSChuck Lever /* Arrange */ 8602142b2cSChuck Lever gk5e = gss_krb5_lookup_enctype(param->enctype); 87*fe90151cSChuck Lever if (!gk5e) 88*fe90151cSChuck Lever kunit_skip(test, "Encryption type is not available"); 8902142b2cSChuck Lever 9002142b2cSChuck Lever Kc.len = gk5e->Kc_length; 9102142b2cSChuck Lever Kc.data = kunit_kzalloc(test, Kc.len, GFP_KERNEL); 9202142b2cSChuck Lever KUNIT_ASSERT_NOT_ERR_OR_NULL(test, Kc.data); 9302142b2cSChuck Lever err = gk5e->derive_key(gk5e, param->base_key, &Kc, 9402142b2cSChuck Lever param->usage, GFP_KERNEL); 9502142b2cSChuck Lever KUNIT_ASSERT_EQ(test, err, 0); 9602142b2cSChuck Lever 9702142b2cSChuck Lever tfm = crypto_alloc_ahash(gk5e->cksum_name, 0, CRYPTO_ALG_ASYNC); 9802142b2cSChuck Lever KUNIT_ASSERT_NOT_ERR_OR_NULL(test, tfm); 9902142b2cSChuck Lever err = crypto_ahash_setkey(tfm, Kc.data, Kc.len); 10002142b2cSChuck Lever KUNIT_ASSERT_EQ(test, err, 0); 10102142b2cSChuck Lever 10202142b2cSChuck Lever checksum.len = gk5e->cksumlength; 10302142b2cSChuck Lever checksum.data = kunit_kzalloc(test, checksum.len, GFP_KERNEL); 10402142b2cSChuck Lever KUNIT_ASSERT_NOT_ERR_OR_NULL(test, checksum.data); 10502142b2cSChuck Lever 10602142b2cSChuck Lever /* Act */ 10702142b2cSChuck Lever err = gss_krb5_checksum(tfm, NULL, 0, &buf, 0, &checksum); 10802142b2cSChuck Lever KUNIT_ASSERT_EQ(test, err, 0); 10902142b2cSChuck Lever 11002142b2cSChuck Lever /* Assert */ 11102142b2cSChuck Lever KUNIT_EXPECT_EQ_MSG(test, 11202142b2cSChuck Lever memcmp(param->expected_result->data, 11302142b2cSChuck Lever checksum.data, checksum.len), 0, 11402142b2cSChuck Lever "checksum mismatch"); 11502142b2cSChuck Lever 11602142b2cSChuck Lever crypto_free_ahash(tfm); 11702142b2cSChuck Lever } 11802142b2cSChuck Lever 119eebd8c2dSChuck Lever #define DEFINE_HEX_XDR_NETOBJ(name, hex_array...) \ 120eebd8c2dSChuck Lever static const u8 name ## _data[] = { hex_array }; \ 121eebd8c2dSChuck Lever static const struct xdr_netobj name = { \ 122eebd8c2dSChuck Lever .data = (u8 *)name##_data, \ 123eebd8c2dSChuck Lever .len = sizeof(name##_data), \ 124eebd8c2dSChuck Lever } 125eebd8c2dSChuck Lever 12602142b2cSChuck Lever #define DEFINE_STR_XDR_NETOBJ(name, string) \ 12702142b2cSChuck Lever static const u8 name ## _str[] = string; \ 12802142b2cSChuck Lever static const struct xdr_netobj name = { \ 12902142b2cSChuck Lever .data = (u8 *)name##_str, \ 13002142b2cSChuck Lever .len = sizeof(name##_str) - 1, \ 13102142b2cSChuck Lever } 13202142b2cSChuck Lever 133eebd8c2dSChuck Lever /* 134eebd8c2dSChuck Lever * RFC 3961 Appendix A.1. n-fold 135eebd8c2dSChuck Lever * 136eebd8c2dSChuck Lever * The n-fold function is defined in section 5.1 of RFC 3961. 137eebd8c2dSChuck Lever * 138eebd8c2dSChuck Lever * This test material is copyright (C) The Internet Society (2005). 139eebd8c2dSChuck Lever */ 140eebd8c2dSChuck Lever 141eebd8c2dSChuck Lever DEFINE_HEX_XDR_NETOBJ(nfold_test1_plaintext, 142eebd8c2dSChuck Lever 0x30, 0x31, 0x32, 0x33, 0x34, 0x35 143eebd8c2dSChuck Lever ); 144eebd8c2dSChuck Lever DEFINE_HEX_XDR_NETOBJ(nfold_test1_expected_result, 145eebd8c2dSChuck Lever 0xbe, 0x07, 0x26, 0x31, 0x27, 0x6b, 0x19, 0x55 146eebd8c2dSChuck Lever ); 147eebd8c2dSChuck Lever 148eebd8c2dSChuck Lever DEFINE_HEX_XDR_NETOBJ(nfold_test2_plaintext, 149eebd8c2dSChuck Lever 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64 150eebd8c2dSChuck Lever ); 151eebd8c2dSChuck Lever DEFINE_HEX_XDR_NETOBJ(nfold_test2_expected_result, 152eebd8c2dSChuck Lever 0x78, 0xa0, 0x7b, 0x6c, 0xaf, 0x85, 0xfa 153eebd8c2dSChuck Lever ); 154eebd8c2dSChuck Lever 155eebd8c2dSChuck Lever DEFINE_HEX_XDR_NETOBJ(nfold_test3_plaintext, 156eebd8c2dSChuck Lever 0x52, 0x6f, 0x75, 0x67, 0x68, 0x20, 0x43, 0x6f, 157eebd8c2dSChuck Lever 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x2c, 158eebd8c2dSChuck Lever 0x20, 0x61, 0x6e, 0x64, 0x20, 0x52, 0x75, 0x6e, 159eebd8c2dSChuck Lever 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x43, 0x6f, 0x64, 160eebd8c2dSChuck Lever 0x65 161eebd8c2dSChuck Lever ); 162eebd8c2dSChuck Lever DEFINE_HEX_XDR_NETOBJ(nfold_test3_expected_result, 163eebd8c2dSChuck Lever 0xbb, 0x6e, 0xd3, 0x08, 0x70, 0xb7, 0xf0, 0xe0 164eebd8c2dSChuck Lever ); 165eebd8c2dSChuck Lever 166eebd8c2dSChuck Lever DEFINE_HEX_XDR_NETOBJ(nfold_test4_plaintext, 167eebd8c2dSChuck Lever 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64 168eebd8c2dSChuck Lever ); 169eebd8c2dSChuck Lever DEFINE_HEX_XDR_NETOBJ(nfold_test4_expected_result, 170eebd8c2dSChuck Lever 0x59, 0xe4, 0xa8, 0xca, 0x7c, 0x03, 0x85, 0xc3, 171eebd8c2dSChuck Lever 0xc3, 0x7b, 0x3f, 0x6d, 0x20, 0x00, 0x24, 0x7c, 172eebd8c2dSChuck Lever 0xb6, 0xe6, 0xbd, 0x5b, 0x3e 173eebd8c2dSChuck Lever ); 174eebd8c2dSChuck Lever 175eebd8c2dSChuck Lever DEFINE_HEX_XDR_NETOBJ(nfold_test5_plaintext, 176eebd8c2dSChuck Lever 0x4d, 0x41, 0x53, 0x53, 0x41, 0x43, 0x48, 0x56, 177eebd8c2dSChuck Lever 0x53, 0x45, 0x54, 0x54, 0x53, 0x20, 0x49, 0x4e, 178eebd8c2dSChuck Lever 0x53, 0x54, 0x49, 0x54, 0x56, 0x54, 0x45, 0x20, 179eebd8c2dSChuck Lever 0x4f, 0x46, 0x20, 0x54, 0x45, 0x43, 0x48, 0x4e, 180eebd8c2dSChuck Lever 0x4f, 0x4c, 0x4f, 0x47, 0x59 181eebd8c2dSChuck Lever ); 182eebd8c2dSChuck Lever DEFINE_HEX_XDR_NETOBJ(nfold_test5_expected_result, 183eebd8c2dSChuck Lever 0xdb, 0x3b, 0x0d, 0x8f, 0x0b, 0x06, 0x1e, 0x60, 184eebd8c2dSChuck Lever 0x32, 0x82, 0xb3, 0x08, 0xa5, 0x08, 0x41, 0x22, 185eebd8c2dSChuck Lever 0x9a, 0xd7, 0x98, 0xfa, 0xb9, 0x54, 0x0c, 0x1b 186eebd8c2dSChuck Lever ); 187eebd8c2dSChuck Lever 188eebd8c2dSChuck Lever DEFINE_HEX_XDR_NETOBJ(nfold_test6_plaintext, 189eebd8c2dSChuck Lever 0x51 190eebd8c2dSChuck Lever ); 191eebd8c2dSChuck Lever DEFINE_HEX_XDR_NETOBJ(nfold_test6_expected_result, 192eebd8c2dSChuck Lever 0x51, 0x8a, 0x54, 0xa2, 0x15, 0xa8, 0x45, 0x2a, 193eebd8c2dSChuck Lever 0x51, 0x8a, 0x54, 0xa2, 0x15, 0xa8, 0x45, 0x2a, 194eebd8c2dSChuck Lever 0x51, 0x8a, 0x54, 0xa2, 0x15 195eebd8c2dSChuck Lever ); 196eebd8c2dSChuck Lever 197eebd8c2dSChuck Lever DEFINE_HEX_XDR_NETOBJ(nfold_test7_plaintext, 198eebd8c2dSChuck Lever 0x62, 0x61 199eebd8c2dSChuck Lever ); 200eebd8c2dSChuck Lever DEFINE_HEX_XDR_NETOBJ(nfold_test7_expected_result, 201eebd8c2dSChuck Lever 0xfb, 0x25, 0xd5, 0x31, 0xae, 0x89, 0x74, 0x49, 202eebd8c2dSChuck Lever 0x9f, 0x52, 0xfd, 0x92, 0xea, 0x98, 0x57, 0xc4, 203eebd8c2dSChuck Lever 0xba, 0x24, 0xcf, 0x29, 0x7e 204eebd8c2dSChuck Lever ); 205eebd8c2dSChuck Lever 206eebd8c2dSChuck Lever DEFINE_HEX_XDR_NETOBJ(nfold_test_kerberos, 207eebd8c2dSChuck Lever 0x6b, 0x65, 0x72, 0x62, 0x65, 0x72, 0x6f, 0x73 208eebd8c2dSChuck Lever ); 209eebd8c2dSChuck Lever DEFINE_HEX_XDR_NETOBJ(nfold_test8_expected_result, 210eebd8c2dSChuck Lever 0x6b, 0x65, 0x72, 0x62, 0x65, 0x72, 0x6f, 0x73 211eebd8c2dSChuck Lever ); 212eebd8c2dSChuck Lever DEFINE_HEX_XDR_NETOBJ(nfold_test9_expected_result, 213eebd8c2dSChuck Lever 0x6b, 0x65, 0x72, 0x62, 0x65, 0x72, 0x6f, 0x73, 214eebd8c2dSChuck Lever 0x7b, 0x9b, 0x5b, 0x2b, 0x93, 0x13, 0x2b, 0x93 215eebd8c2dSChuck Lever ); 216eebd8c2dSChuck Lever DEFINE_HEX_XDR_NETOBJ(nfold_test10_expected_result, 217eebd8c2dSChuck Lever 0x83, 0x72, 0xc2, 0x36, 0x34, 0x4e, 0x5f, 0x15, 218eebd8c2dSChuck Lever 0x50, 0xcd, 0x07, 0x47, 0xe1, 0x5d, 0x62, 0xca, 219eebd8c2dSChuck Lever 0x7a, 0x5a, 0x3b, 0xce, 0xa4 220eebd8c2dSChuck Lever ); 221eebd8c2dSChuck Lever DEFINE_HEX_XDR_NETOBJ(nfold_test11_expected_result, 222eebd8c2dSChuck Lever 0x6b, 0x65, 0x72, 0x62, 0x65, 0x72, 0x6f, 0x73, 223eebd8c2dSChuck Lever 0x7b, 0x9b, 0x5b, 0x2b, 0x93, 0x13, 0x2b, 0x93, 224eebd8c2dSChuck Lever 0x5c, 0x9b, 0xdc, 0xda, 0xd9, 0x5c, 0x98, 0x99, 225eebd8c2dSChuck Lever 0xc4, 0xca, 0xe4, 0xde, 0xe6, 0xd6, 0xca, 0xe4 226eebd8c2dSChuck Lever ); 227eebd8c2dSChuck Lever 228eebd8c2dSChuck Lever static const struct gss_krb5_test_param rfc3961_nfold_test_params[] = { 229eebd8c2dSChuck Lever { 230eebd8c2dSChuck Lever .desc = "64-fold(\"012345\")", 231eebd8c2dSChuck Lever .nfold = 64, 232eebd8c2dSChuck Lever .plaintext = &nfold_test1_plaintext, 233eebd8c2dSChuck Lever .expected_result = &nfold_test1_expected_result, 234eebd8c2dSChuck Lever }, 235eebd8c2dSChuck Lever { 236eebd8c2dSChuck Lever .desc = "56-fold(\"password\")", 237eebd8c2dSChuck Lever .nfold = 56, 238eebd8c2dSChuck Lever .plaintext = &nfold_test2_plaintext, 239eebd8c2dSChuck Lever .expected_result = &nfold_test2_expected_result, 240eebd8c2dSChuck Lever }, 241eebd8c2dSChuck Lever { 242eebd8c2dSChuck Lever .desc = "64-fold(\"Rough Consensus, and Running Code\")", 243eebd8c2dSChuck Lever .nfold = 64, 244eebd8c2dSChuck Lever .plaintext = &nfold_test3_plaintext, 245eebd8c2dSChuck Lever .expected_result = &nfold_test3_expected_result, 246eebd8c2dSChuck Lever }, 247eebd8c2dSChuck Lever { 248eebd8c2dSChuck Lever .desc = "168-fold(\"password\")", 249eebd8c2dSChuck Lever .nfold = 168, 250eebd8c2dSChuck Lever .plaintext = &nfold_test4_plaintext, 251eebd8c2dSChuck Lever .expected_result = &nfold_test4_expected_result, 252eebd8c2dSChuck Lever }, 253eebd8c2dSChuck Lever { 254eebd8c2dSChuck Lever .desc = "192-fold(\"MASSACHVSETTS INSTITVTE OF TECHNOLOGY\")", 255eebd8c2dSChuck Lever .nfold = 192, 256eebd8c2dSChuck Lever .plaintext = &nfold_test5_plaintext, 257eebd8c2dSChuck Lever .expected_result = &nfold_test5_expected_result, 258eebd8c2dSChuck Lever }, 259eebd8c2dSChuck Lever { 260eebd8c2dSChuck Lever .desc = "168-fold(\"Q\")", 261eebd8c2dSChuck Lever .nfold = 168, 262eebd8c2dSChuck Lever .plaintext = &nfold_test6_plaintext, 263eebd8c2dSChuck Lever .expected_result = &nfold_test6_expected_result, 264eebd8c2dSChuck Lever }, 265eebd8c2dSChuck Lever { 266eebd8c2dSChuck Lever .desc = "168-fold(\"ba\")", 267eebd8c2dSChuck Lever .nfold = 168, 268eebd8c2dSChuck Lever .plaintext = &nfold_test7_plaintext, 269eebd8c2dSChuck Lever .expected_result = &nfold_test7_expected_result, 270eebd8c2dSChuck Lever }, 271eebd8c2dSChuck Lever { 272eebd8c2dSChuck Lever .desc = "64-fold(\"kerberos\")", 273eebd8c2dSChuck Lever .nfold = 64, 274eebd8c2dSChuck Lever .plaintext = &nfold_test_kerberos, 275eebd8c2dSChuck Lever .expected_result = &nfold_test8_expected_result, 276eebd8c2dSChuck Lever }, 277eebd8c2dSChuck Lever { 278eebd8c2dSChuck Lever .desc = "128-fold(\"kerberos\")", 279eebd8c2dSChuck Lever .nfold = 128, 280eebd8c2dSChuck Lever .plaintext = &nfold_test_kerberos, 281eebd8c2dSChuck Lever .expected_result = &nfold_test9_expected_result, 282eebd8c2dSChuck Lever }, 283eebd8c2dSChuck Lever { 284eebd8c2dSChuck Lever .desc = "168-fold(\"kerberos\")", 285eebd8c2dSChuck Lever .nfold = 168, 286eebd8c2dSChuck Lever .plaintext = &nfold_test_kerberos, 287eebd8c2dSChuck Lever .expected_result = &nfold_test10_expected_result, 288eebd8c2dSChuck Lever }, 289eebd8c2dSChuck Lever { 290eebd8c2dSChuck Lever .desc = "256-fold(\"kerberos\")", 291eebd8c2dSChuck Lever .nfold = 256, 292eebd8c2dSChuck Lever .plaintext = &nfold_test_kerberos, 293eebd8c2dSChuck Lever .expected_result = &nfold_test11_expected_result, 294eebd8c2dSChuck Lever }, 295eebd8c2dSChuck Lever }; 296eebd8c2dSChuck Lever 297eebd8c2dSChuck Lever /* Creates the function rfc3961_nfold_gen_params */ 298eebd8c2dSChuck Lever KUNIT_ARRAY_PARAM(rfc3961_nfold, rfc3961_nfold_test_params, gss_krb5_get_desc); 299eebd8c2dSChuck Lever 300eebd8c2dSChuck Lever static void rfc3961_nfold_case(struct kunit *test) 301eebd8c2dSChuck Lever { 302eebd8c2dSChuck Lever const struct gss_krb5_test_param *param = test->param_value; 303eebd8c2dSChuck Lever u8 *result; 304eebd8c2dSChuck Lever 305eebd8c2dSChuck Lever /* Arrange */ 306eebd8c2dSChuck Lever result = kunit_kzalloc(test, 4096, GFP_KERNEL); 307eebd8c2dSChuck Lever KUNIT_ASSERT_NOT_ERR_OR_NULL(test, result); 308eebd8c2dSChuck Lever 309eebd8c2dSChuck Lever /* Act */ 310eebd8c2dSChuck Lever krb5_nfold(param->plaintext->len * 8, param->plaintext->data, 311eebd8c2dSChuck Lever param->expected_result->len * 8, result); 312eebd8c2dSChuck Lever 313eebd8c2dSChuck Lever /* Assert */ 314eebd8c2dSChuck Lever KUNIT_EXPECT_EQ_MSG(test, 315eebd8c2dSChuck Lever memcmp(param->expected_result->data, 316eebd8c2dSChuck Lever result, param->expected_result->len), 0, 317eebd8c2dSChuck Lever "result mismatch"); 318eebd8c2dSChuck Lever } 319eebd8c2dSChuck Lever 3206eb6b8a4SChuck Lever /* 3216eb6b8a4SChuck Lever * RFC 3961 Appendix A.3. DES3 DR and DK 3226eb6b8a4SChuck Lever * 3236eb6b8a4SChuck Lever * These tests show the derived-random and derived-key values for the 3246eb6b8a4SChuck Lever * des3-hmac-sha1-kd encryption scheme, using the DR and DK functions 3256eb6b8a4SChuck Lever * defined in section 6.3.1. The input keys were randomly generated; 3266eb6b8a4SChuck Lever * the usage values are from this specification. 3276eb6b8a4SChuck Lever * 3286eb6b8a4SChuck Lever * This test material is copyright (C) The Internet Society (2005). 3296eb6b8a4SChuck Lever */ 3306eb6b8a4SChuck Lever 3316eb6b8a4SChuck Lever DEFINE_HEX_XDR_NETOBJ(des3_dk_usage_155, 3326eb6b8a4SChuck Lever 0x00, 0x00, 0x00, 0x01, 0x55 3336eb6b8a4SChuck Lever ); 3346eb6b8a4SChuck Lever 3356eb6b8a4SChuck Lever DEFINE_HEX_XDR_NETOBJ(des3_dk_usage_1aa, 3366eb6b8a4SChuck Lever 0x00, 0x00, 0x00, 0x01, 0xaa 3376eb6b8a4SChuck Lever ); 3386eb6b8a4SChuck Lever 3396eb6b8a4SChuck Lever DEFINE_HEX_XDR_NETOBJ(des3_dk_usage_kerberos, 3406eb6b8a4SChuck Lever 0x6b, 0x65, 0x72, 0x62, 0x65, 0x72, 0x6f, 0x73 3416eb6b8a4SChuck Lever ); 3426eb6b8a4SChuck Lever 3436eb6b8a4SChuck Lever DEFINE_HEX_XDR_NETOBJ(des3_dk_test1_base_key, 3446eb6b8a4SChuck Lever 0xdc, 0xe0, 0x6b, 0x1f, 0x64, 0xc8, 0x57, 0xa1, 3456eb6b8a4SChuck Lever 0x1c, 0x3d, 0xb5, 0x7c, 0x51, 0x89, 0x9b, 0x2c, 3466eb6b8a4SChuck Lever 0xc1, 0x79, 0x10, 0x08, 0xce, 0x97, 0x3b, 0x92 3476eb6b8a4SChuck Lever ); 3486eb6b8a4SChuck Lever DEFINE_HEX_XDR_NETOBJ(des3_dk_test1_derived_key, 3496eb6b8a4SChuck Lever 0x92, 0x51, 0x79, 0xd0, 0x45, 0x91, 0xa7, 0x9b, 3506eb6b8a4SChuck Lever 0x5d, 0x31, 0x92, 0xc4, 0xa7, 0xe9, 0xc2, 0x89, 3516eb6b8a4SChuck Lever 0xb0, 0x49, 0xc7, 0x1f, 0x6e, 0xe6, 0x04, 0xcd 3526eb6b8a4SChuck Lever ); 3536eb6b8a4SChuck Lever 3546eb6b8a4SChuck Lever DEFINE_HEX_XDR_NETOBJ(des3_dk_test2_base_key, 3556eb6b8a4SChuck Lever 0x5e, 0x13, 0xd3, 0x1c, 0x70, 0xef, 0x76, 0x57, 3566eb6b8a4SChuck Lever 0x46, 0x57, 0x85, 0x31, 0xcb, 0x51, 0xc1, 0x5b, 3576eb6b8a4SChuck Lever 0xf1, 0x1c, 0xa8, 0x2c, 0x97, 0xce, 0xe9, 0xf2 3586eb6b8a4SChuck Lever ); 3596eb6b8a4SChuck Lever DEFINE_HEX_XDR_NETOBJ(des3_dk_test2_derived_key, 3606eb6b8a4SChuck Lever 0x9e, 0x58, 0xe5, 0xa1, 0x46, 0xd9, 0x94, 0x2a, 3616eb6b8a4SChuck Lever 0x10, 0x1c, 0x46, 0x98, 0x45, 0xd6, 0x7a, 0x20, 3626eb6b8a4SChuck Lever 0xe3, 0xc4, 0x25, 0x9e, 0xd9, 0x13, 0xf2, 0x07 3636eb6b8a4SChuck Lever ); 3646eb6b8a4SChuck Lever 3656eb6b8a4SChuck Lever DEFINE_HEX_XDR_NETOBJ(des3_dk_test3_base_key, 3666eb6b8a4SChuck Lever 0x98, 0xe6, 0xfd, 0x8a, 0x04, 0xa4, 0xb6, 0x85, 3676eb6b8a4SChuck Lever 0x9b, 0x75, 0xa1, 0x76, 0x54, 0x0b, 0x97, 0x52, 3686eb6b8a4SChuck Lever 0xba, 0xd3, 0xec, 0xd6, 0x10, 0xa2, 0x52, 0xbc 3696eb6b8a4SChuck Lever ); 3706eb6b8a4SChuck Lever DEFINE_HEX_XDR_NETOBJ(des3_dk_test3_derived_key, 3716eb6b8a4SChuck Lever 0x13, 0xfe, 0xf8, 0x0d, 0x76, 0x3e, 0x94, 0xec, 3726eb6b8a4SChuck Lever 0x6d, 0x13, 0xfd, 0x2c, 0xa1, 0xd0, 0x85, 0x07, 3736eb6b8a4SChuck Lever 0x02, 0x49, 0xda, 0xd3, 0x98, 0x08, 0xea, 0xbf 3746eb6b8a4SChuck Lever ); 3756eb6b8a4SChuck Lever 3766eb6b8a4SChuck Lever DEFINE_HEX_XDR_NETOBJ(des3_dk_test4_base_key, 3776eb6b8a4SChuck Lever 0x62, 0x2a, 0xec, 0x25, 0xa2, 0xfe, 0x2c, 0xad, 3786eb6b8a4SChuck Lever 0x70, 0x94, 0x68, 0x0b, 0x7c, 0x64, 0x94, 0x02, 3796eb6b8a4SChuck Lever 0x80, 0x08, 0x4c, 0x1a, 0x7c, 0xec, 0x92, 0xb5 3806eb6b8a4SChuck Lever ); 3816eb6b8a4SChuck Lever DEFINE_HEX_XDR_NETOBJ(des3_dk_test4_derived_key, 3826eb6b8a4SChuck Lever 0xf8, 0xdf, 0xbf, 0x04, 0xb0, 0x97, 0xe6, 0xd9, 3836eb6b8a4SChuck Lever 0xdc, 0x07, 0x02, 0x68, 0x6b, 0xcb, 0x34, 0x89, 3846eb6b8a4SChuck Lever 0xd9, 0x1f, 0xd9, 0xa4, 0x51, 0x6b, 0x70, 0x3e 3856eb6b8a4SChuck Lever ); 3866eb6b8a4SChuck Lever 3876eb6b8a4SChuck Lever DEFINE_HEX_XDR_NETOBJ(des3_dk_test5_base_key, 3886eb6b8a4SChuck Lever 0xd3, 0xf8, 0x29, 0x8c, 0xcb, 0x16, 0x64, 0x38, 3896eb6b8a4SChuck Lever 0xdc, 0xb9, 0xb9, 0x3e, 0xe5, 0xa7, 0x62, 0x92, 3906eb6b8a4SChuck Lever 0x86, 0xa4, 0x91, 0xf8, 0x38, 0xf8, 0x02, 0xfb 3916eb6b8a4SChuck Lever ); 3926eb6b8a4SChuck Lever DEFINE_HEX_XDR_NETOBJ(des3_dk_test5_derived_key, 3936eb6b8a4SChuck Lever 0x23, 0x70, 0xda, 0x57, 0x5d, 0x2a, 0x3d, 0xa8, 3946eb6b8a4SChuck Lever 0x64, 0xce, 0xbf, 0xdc, 0x52, 0x04, 0xd5, 0x6d, 3956eb6b8a4SChuck Lever 0xf7, 0x79, 0xa7, 0xdf, 0x43, 0xd9, 0xda, 0x43 3966eb6b8a4SChuck Lever ); 3976eb6b8a4SChuck Lever 3986eb6b8a4SChuck Lever DEFINE_HEX_XDR_NETOBJ(des3_dk_test6_base_key, 3996eb6b8a4SChuck Lever 0xc1, 0x08, 0x16, 0x49, 0xad, 0xa7, 0x43, 0x62, 4006eb6b8a4SChuck Lever 0xe6, 0xa1, 0x45, 0x9d, 0x01, 0xdf, 0xd3, 0x0d, 4016eb6b8a4SChuck Lever 0x67, 0xc2, 0x23, 0x4c, 0x94, 0x07, 0x04, 0xda 4026eb6b8a4SChuck Lever ); 4036eb6b8a4SChuck Lever DEFINE_HEX_XDR_NETOBJ(des3_dk_test6_derived_key, 4046eb6b8a4SChuck Lever 0x34, 0x80, 0x57, 0xec, 0x98, 0xfd, 0xc4, 0x80, 4056eb6b8a4SChuck Lever 0x16, 0x16, 0x1c, 0x2a, 0x4c, 0x7a, 0x94, 0x3e, 4066eb6b8a4SChuck Lever 0x92, 0xae, 0x49, 0x2c, 0x98, 0x91, 0x75, 0xf7 4076eb6b8a4SChuck Lever ); 4086eb6b8a4SChuck Lever 4096eb6b8a4SChuck Lever DEFINE_HEX_XDR_NETOBJ(des3_dk_test7_base_key, 4106eb6b8a4SChuck Lever 0x5d, 0x15, 0x4a, 0xf2, 0x38, 0xf4, 0x67, 0x13, 4116eb6b8a4SChuck Lever 0x15, 0x57, 0x19, 0xd5, 0x5e, 0x2f, 0x1f, 0x79, 4126eb6b8a4SChuck Lever 0x0d, 0xd6, 0x61, 0xf2, 0x79, 0xa7, 0x91, 0x7c 4136eb6b8a4SChuck Lever ); 4146eb6b8a4SChuck Lever DEFINE_HEX_XDR_NETOBJ(des3_dk_test7_derived_key, 4156eb6b8a4SChuck Lever 0xa8, 0x80, 0x8a, 0xc2, 0x67, 0xda, 0xda, 0x3d, 4166eb6b8a4SChuck Lever 0xcb, 0xe9, 0xa7, 0xc8, 0x46, 0x26, 0xfb, 0xc7, 4176eb6b8a4SChuck Lever 0x61, 0xc2, 0x94, 0xb0, 0x13, 0x15, 0xe5, 0xc1 4186eb6b8a4SChuck Lever ); 4196eb6b8a4SChuck Lever 4206eb6b8a4SChuck Lever DEFINE_HEX_XDR_NETOBJ(des3_dk_test8_base_key, 4216eb6b8a4SChuck Lever 0x79, 0x85, 0x62, 0xe0, 0x49, 0x85, 0x2f, 0x57, 4226eb6b8a4SChuck Lever 0xdc, 0x8c, 0x34, 0x3b, 0xa1, 0x7f, 0x2c, 0xa1, 4236eb6b8a4SChuck Lever 0xd9, 0x73, 0x94, 0xef, 0xc8, 0xad, 0xc4, 0x43 4246eb6b8a4SChuck Lever ); 4256eb6b8a4SChuck Lever DEFINE_HEX_XDR_NETOBJ(des3_dk_test8_derived_key, 4266eb6b8a4SChuck Lever 0xc8, 0x13, 0xf8, 0x8a, 0x3b, 0xe3, 0xb3, 0x34, 4276eb6b8a4SChuck Lever 0xf7, 0x54, 0x25, 0xce, 0x91, 0x75, 0xfb, 0xe3, 4286eb6b8a4SChuck Lever 0xc8, 0x49, 0x3b, 0x89, 0xc8, 0x70, 0x3b, 0x49 4296eb6b8a4SChuck Lever ); 4306eb6b8a4SChuck Lever 4316eb6b8a4SChuck Lever DEFINE_HEX_XDR_NETOBJ(des3_dk_test9_base_key, 4326eb6b8a4SChuck Lever 0x26, 0xdc, 0xe3, 0x34, 0xb5, 0x45, 0x29, 0x2f, 4336eb6b8a4SChuck Lever 0x2f, 0xea, 0xb9, 0xa8, 0x70, 0x1a, 0x89, 0xa4, 4346eb6b8a4SChuck Lever 0xb9, 0x9e, 0xb9, 0x94, 0x2c, 0xec, 0xd0, 0x16 4356eb6b8a4SChuck Lever ); 4366eb6b8a4SChuck Lever DEFINE_HEX_XDR_NETOBJ(des3_dk_test9_derived_key, 4376eb6b8a4SChuck Lever 0xf4, 0x8f, 0xfd, 0x6e, 0x83, 0xf8, 0x3e, 0x73, 4386eb6b8a4SChuck Lever 0x54, 0xe6, 0x94, 0xfd, 0x25, 0x2c, 0xf8, 0x3b, 4396eb6b8a4SChuck Lever 0xfe, 0x58, 0xf7, 0xd5, 0xba, 0x37, 0xec, 0x5d 4406eb6b8a4SChuck Lever ); 4416eb6b8a4SChuck Lever 4426eb6b8a4SChuck Lever static const struct gss_krb5_test_param rfc3961_kdf_test_params[] = { 4436eb6b8a4SChuck Lever { 4446eb6b8a4SChuck Lever .desc = "des3-hmac-sha1 key derivation case 1", 4456eb6b8a4SChuck Lever .enctype = ENCTYPE_DES3_CBC_RAW, 4466eb6b8a4SChuck Lever .base_key = &des3_dk_test1_base_key, 4476eb6b8a4SChuck Lever .usage = &des3_dk_usage_155, 4486eb6b8a4SChuck Lever .expected_result = &des3_dk_test1_derived_key, 4496eb6b8a4SChuck Lever }, 4506eb6b8a4SChuck Lever { 4516eb6b8a4SChuck Lever .desc = "des3-hmac-sha1 key derivation case 2", 4526eb6b8a4SChuck Lever .enctype = ENCTYPE_DES3_CBC_RAW, 4536eb6b8a4SChuck Lever .base_key = &des3_dk_test2_base_key, 4546eb6b8a4SChuck Lever .usage = &des3_dk_usage_1aa, 4556eb6b8a4SChuck Lever .expected_result = &des3_dk_test2_derived_key, 4566eb6b8a4SChuck Lever }, 4576eb6b8a4SChuck Lever { 4586eb6b8a4SChuck Lever .desc = "des3-hmac-sha1 key derivation case 3", 4596eb6b8a4SChuck Lever .enctype = ENCTYPE_DES3_CBC_RAW, 4606eb6b8a4SChuck Lever .base_key = &des3_dk_test3_base_key, 4616eb6b8a4SChuck Lever .usage = &des3_dk_usage_155, 4626eb6b8a4SChuck Lever .expected_result = &des3_dk_test3_derived_key, 4636eb6b8a4SChuck Lever }, 4646eb6b8a4SChuck Lever { 4656eb6b8a4SChuck Lever .desc = "des3-hmac-sha1 key derivation case 4", 4666eb6b8a4SChuck Lever .enctype = ENCTYPE_DES3_CBC_RAW, 4676eb6b8a4SChuck Lever .base_key = &des3_dk_test4_base_key, 4686eb6b8a4SChuck Lever .usage = &des3_dk_usage_1aa, 4696eb6b8a4SChuck Lever .expected_result = &des3_dk_test4_derived_key, 4706eb6b8a4SChuck Lever }, 4716eb6b8a4SChuck Lever { 4726eb6b8a4SChuck Lever .desc = "des3-hmac-sha1 key derivation case 5", 4736eb6b8a4SChuck Lever .enctype = ENCTYPE_DES3_CBC_RAW, 4746eb6b8a4SChuck Lever .base_key = &des3_dk_test5_base_key, 4756eb6b8a4SChuck Lever .usage = &des3_dk_usage_kerberos, 4766eb6b8a4SChuck Lever .expected_result = &des3_dk_test5_derived_key, 4776eb6b8a4SChuck Lever }, 4786eb6b8a4SChuck Lever { 4796eb6b8a4SChuck Lever .desc = "des3-hmac-sha1 key derivation case 6", 4806eb6b8a4SChuck Lever .enctype = ENCTYPE_DES3_CBC_RAW, 4816eb6b8a4SChuck Lever .base_key = &des3_dk_test6_base_key, 4826eb6b8a4SChuck Lever .usage = &des3_dk_usage_155, 4836eb6b8a4SChuck Lever .expected_result = &des3_dk_test6_derived_key, 4846eb6b8a4SChuck Lever }, 4856eb6b8a4SChuck Lever { 4866eb6b8a4SChuck Lever .desc = "des3-hmac-sha1 key derivation case 7", 4876eb6b8a4SChuck Lever .enctype = ENCTYPE_DES3_CBC_RAW, 4886eb6b8a4SChuck Lever .base_key = &des3_dk_test7_base_key, 4896eb6b8a4SChuck Lever .usage = &des3_dk_usage_1aa, 4906eb6b8a4SChuck Lever .expected_result = &des3_dk_test7_derived_key, 4916eb6b8a4SChuck Lever }, 4926eb6b8a4SChuck Lever { 4936eb6b8a4SChuck Lever .desc = "des3-hmac-sha1 key derivation case 8", 4946eb6b8a4SChuck Lever .enctype = ENCTYPE_DES3_CBC_RAW, 4956eb6b8a4SChuck Lever .base_key = &des3_dk_test8_base_key, 4966eb6b8a4SChuck Lever .usage = &des3_dk_usage_155, 4976eb6b8a4SChuck Lever .expected_result = &des3_dk_test8_derived_key, 4986eb6b8a4SChuck Lever }, 4996eb6b8a4SChuck Lever { 5006eb6b8a4SChuck Lever .desc = "des3-hmac-sha1 key derivation case 9", 5016eb6b8a4SChuck Lever .enctype = ENCTYPE_DES3_CBC_RAW, 5026eb6b8a4SChuck Lever .base_key = &des3_dk_test9_base_key, 5036eb6b8a4SChuck Lever .usage = &des3_dk_usage_1aa, 5046eb6b8a4SChuck Lever .expected_result = &des3_dk_test9_derived_key, 5056eb6b8a4SChuck Lever }, 5066eb6b8a4SChuck Lever }; 5076eb6b8a4SChuck Lever 5086eb6b8a4SChuck Lever /* Creates the function rfc3961_kdf_gen_params */ 5096eb6b8a4SChuck Lever KUNIT_ARRAY_PARAM(rfc3961_kdf, rfc3961_kdf_test_params, gss_krb5_get_desc); 5106eb6b8a4SChuck Lever 511eebd8c2dSChuck Lever static struct kunit_case rfc3961_test_cases[] = { 512eebd8c2dSChuck Lever { 513eebd8c2dSChuck Lever .name = "RFC 3961 n-fold", 514eebd8c2dSChuck Lever .run_case = rfc3961_nfold_case, 515eebd8c2dSChuck Lever .generate_params = rfc3961_nfold_gen_params, 516eebd8c2dSChuck Lever }, 5176eb6b8a4SChuck Lever { 5186eb6b8a4SChuck Lever .name = "RFC 3961 key derivation", 5196eb6b8a4SChuck Lever .run_case = kdf_case, 5206eb6b8a4SChuck Lever .generate_params = rfc3961_kdf_gen_params, 5216eb6b8a4SChuck Lever }, 522eebd8c2dSChuck Lever }; 523eebd8c2dSChuck Lever 524eebd8c2dSChuck Lever static struct kunit_suite rfc3961_suite = { 525eebd8c2dSChuck Lever .name = "RFC 3961 tests", 526eebd8c2dSChuck Lever .test_cases = rfc3961_test_cases, 527eebd8c2dSChuck Lever }; 528eebd8c2dSChuck Lever 529e1a9a384SChuck Lever /* 530e1a9a384SChuck Lever * From RFC 3962 Appendix B: Sample Test Vectors 531e1a9a384SChuck Lever * 532e1a9a384SChuck Lever * Some test vectors for CBC with ciphertext stealing, using an 533e1a9a384SChuck Lever * initial vector of all-zero. 534e1a9a384SChuck Lever * 535e1a9a384SChuck Lever * This test material is copyright (C) The Internet Society (2005). 536e1a9a384SChuck Lever */ 537e1a9a384SChuck Lever 538e1a9a384SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc3962_encryption_key, 539e1a9a384SChuck Lever 0x63, 0x68, 0x69, 0x63, 0x6b, 0x65, 0x6e, 0x20, 540e1a9a384SChuck Lever 0x74, 0x65, 0x72, 0x69, 0x79, 0x61, 0x6b, 0x69 541e1a9a384SChuck Lever ); 542e1a9a384SChuck Lever 543e1a9a384SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc3962_enc_test1_plaintext, 544e1a9a384SChuck Lever 0x49, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20, 545e1a9a384SChuck Lever 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65, 546e1a9a384SChuck Lever 0x20 547e1a9a384SChuck Lever ); 548e1a9a384SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc3962_enc_test1_expected_result, 549e1a9a384SChuck Lever 0xc6, 0x35, 0x35, 0x68, 0xf2, 0xbf, 0x8c, 0xb4, 550e1a9a384SChuck Lever 0xd8, 0xa5, 0x80, 0x36, 0x2d, 0xa7, 0xff, 0x7f, 551e1a9a384SChuck Lever 0x97 552e1a9a384SChuck Lever ); 553e1a9a384SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc3962_enc_test1_next_iv, 554e1a9a384SChuck Lever 0xc6, 0x35, 0x35, 0x68, 0xf2, 0xbf, 0x8c, 0xb4, 555e1a9a384SChuck Lever 0xd8, 0xa5, 0x80, 0x36, 0x2d, 0xa7, 0xff, 0x7f 556e1a9a384SChuck Lever ); 557e1a9a384SChuck Lever 558e1a9a384SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc3962_enc_test2_plaintext, 559e1a9a384SChuck Lever 0x49, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20, 560e1a9a384SChuck Lever 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65, 561e1a9a384SChuck Lever 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 562e1a9a384SChuck Lever 0x20, 0x47, 0x61, 0x75, 0x27, 0x73, 0x20 563e1a9a384SChuck Lever ); 564e1a9a384SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc3962_enc_test2_expected_result, 565e1a9a384SChuck Lever 0xfc, 0x00, 0x78, 0x3e, 0x0e, 0xfd, 0xb2, 0xc1, 566e1a9a384SChuck Lever 0xd4, 0x45, 0xd4, 0xc8, 0xef, 0xf7, 0xed, 0x22, 567e1a9a384SChuck Lever 0x97, 0x68, 0x72, 0x68, 0xd6, 0xec, 0xcc, 0xc0, 568e1a9a384SChuck Lever 0xc0, 0x7b, 0x25, 0xe2, 0x5e, 0xcf, 0xe5 569e1a9a384SChuck Lever ); 570e1a9a384SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc3962_enc_test2_next_iv, 571e1a9a384SChuck Lever 0xfc, 0x00, 0x78, 0x3e, 0x0e, 0xfd, 0xb2, 0xc1, 572e1a9a384SChuck Lever 0xd4, 0x45, 0xd4, 0xc8, 0xef, 0xf7, 0xed, 0x22 573e1a9a384SChuck Lever ); 574e1a9a384SChuck Lever 575e1a9a384SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc3962_enc_test3_plaintext, 576e1a9a384SChuck Lever 0x49, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20, 577e1a9a384SChuck Lever 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65, 578e1a9a384SChuck Lever 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 579e1a9a384SChuck Lever 0x20, 0x47, 0x61, 0x75, 0x27, 0x73, 0x20, 0x43 580e1a9a384SChuck Lever ); 581e1a9a384SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc3962_enc_test3_expected_result, 582e1a9a384SChuck Lever 0x39, 0x31, 0x25, 0x23, 0xa7, 0x86, 0x62, 0xd5, 583e1a9a384SChuck Lever 0xbe, 0x7f, 0xcb, 0xcc, 0x98, 0xeb, 0xf5, 0xa8, 584e1a9a384SChuck Lever 0x97, 0x68, 0x72, 0x68, 0xd6, 0xec, 0xcc, 0xc0, 585e1a9a384SChuck Lever 0xc0, 0x7b, 0x25, 0xe2, 0x5e, 0xcf, 0xe5, 0x84 586e1a9a384SChuck Lever ); 587e1a9a384SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc3962_enc_test3_next_iv, 588e1a9a384SChuck Lever 0x39, 0x31, 0x25, 0x23, 0xa7, 0x86, 0x62, 0xd5, 589e1a9a384SChuck Lever 0xbe, 0x7f, 0xcb, 0xcc, 0x98, 0xeb, 0xf5, 0xa8 590e1a9a384SChuck Lever ); 591e1a9a384SChuck Lever 592e1a9a384SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc3962_enc_test4_plaintext, 593e1a9a384SChuck Lever 0x49, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20, 594e1a9a384SChuck Lever 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65, 595e1a9a384SChuck Lever 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 596e1a9a384SChuck Lever 0x20, 0x47, 0x61, 0x75, 0x27, 0x73, 0x20, 0x43, 597e1a9a384SChuck Lever 0x68, 0x69, 0x63, 0x6b, 0x65, 0x6e, 0x2c, 0x20, 598e1a9a384SChuck Lever 0x70, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2c 599e1a9a384SChuck Lever ); 600e1a9a384SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc3962_enc_test4_expected_result, 601e1a9a384SChuck Lever 0x97, 0x68, 0x72, 0x68, 0xd6, 0xec, 0xcc, 0xc0, 602e1a9a384SChuck Lever 0xc0, 0x7b, 0x25, 0xe2, 0x5e, 0xcf, 0xe5, 0x84, 603e1a9a384SChuck Lever 0xb3, 0xff, 0xfd, 0x94, 0x0c, 0x16, 0xa1, 0x8c, 604e1a9a384SChuck Lever 0x1b, 0x55, 0x49, 0xd2, 0xf8, 0x38, 0x02, 0x9e, 605e1a9a384SChuck Lever 0x39, 0x31, 0x25, 0x23, 0xa7, 0x86, 0x62, 0xd5, 606e1a9a384SChuck Lever 0xbe, 0x7f, 0xcb, 0xcc, 0x98, 0xeb, 0xf5 607e1a9a384SChuck Lever ); 608e1a9a384SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc3962_enc_test4_next_iv, 609e1a9a384SChuck Lever 0xb3, 0xff, 0xfd, 0x94, 0x0c, 0x16, 0xa1, 0x8c, 610e1a9a384SChuck Lever 0x1b, 0x55, 0x49, 0xd2, 0xf8, 0x38, 0x02, 0x9e 611e1a9a384SChuck Lever ); 612e1a9a384SChuck Lever 613e1a9a384SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc3962_enc_test5_plaintext, 614e1a9a384SChuck Lever 0x49, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20, 615e1a9a384SChuck Lever 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65, 616e1a9a384SChuck Lever 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 617e1a9a384SChuck Lever 0x20, 0x47, 0x61, 0x75, 0x27, 0x73, 0x20, 0x43, 618e1a9a384SChuck Lever 0x68, 0x69, 0x63, 0x6b, 0x65, 0x6e, 0x2c, 0x20, 619e1a9a384SChuck Lever 0x70, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2c, 0x20 620e1a9a384SChuck Lever ); 621e1a9a384SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc3962_enc_test5_expected_result, 622e1a9a384SChuck Lever 0x97, 0x68, 0x72, 0x68, 0xd6, 0xec, 0xcc, 0xc0, 623e1a9a384SChuck Lever 0xc0, 0x7b, 0x25, 0xe2, 0x5e, 0xcf, 0xe5, 0x84, 624e1a9a384SChuck Lever 0x9d, 0xad, 0x8b, 0xbb, 0x96, 0xc4, 0xcd, 0xc0, 625e1a9a384SChuck Lever 0x3b, 0xc1, 0x03, 0xe1, 0xa1, 0x94, 0xbb, 0xd8, 626e1a9a384SChuck Lever 0x39, 0x31, 0x25, 0x23, 0xa7, 0x86, 0x62, 0xd5, 627e1a9a384SChuck Lever 0xbe, 0x7f, 0xcb, 0xcc, 0x98, 0xeb, 0xf5, 0xa8 628e1a9a384SChuck Lever ); 629e1a9a384SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc3962_enc_test5_next_iv, 630e1a9a384SChuck Lever 0x9d, 0xad, 0x8b, 0xbb, 0x96, 0xc4, 0xcd, 0xc0, 631e1a9a384SChuck Lever 0x3b, 0xc1, 0x03, 0xe1, 0xa1, 0x94, 0xbb, 0xd8 632e1a9a384SChuck Lever ); 633e1a9a384SChuck Lever 634e1a9a384SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc3962_enc_test6_plaintext, 635e1a9a384SChuck Lever 0x49, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20, 636e1a9a384SChuck Lever 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65, 637e1a9a384SChuck Lever 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 638e1a9a384SChuck Lever 0x20, 0x47, 0x61, 0x75, 0x27, 0x73, 0x20, 0x43, 639e1a9a384SChuck Lever 0x68, 0x69, 0x63, 0x6b, 0x65, 0x6e, 0x2c, 0x20, 640e1a9a384SChuck Lever 0x70, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2c, 0x20, 641e1a9a384SChuck Lever 0x61, 0x6e, 0x64, 0x20, 0x77, 0x6f, 0x6e, 0x74, 642e1a9a384SChuck Lever 0x6f, 0x6e, 0x20, 0x73, 0x6f, 0x75, 0x70, 0x2e 643e1a9a384SChuck Lever ); 644e1a9a384SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc3962_enc_test6_expected_result, 645e1a9a384SChuck Lever 0x97, 0x68, 0x72, 0x68, 0xd6, 0xec, 0xcc, 0xc0, 646e1a9a384SChuck Lever 0xc0, 0x7b, 0x25, 0xe2, 0x5e, 0xcf, 0xe5, 0x84, 647e1a9a384SChuck Lever 0x39, 0x31, 0x25, 0x23, 0xa7, 0x86, 0x62, 0xd5, 648e1a9a384SChuck Lever 0xbe, 0x7f, 0xcb, 0xcc, 0x98, 0xeb, 0xf5, 0xa8, 649e1a9a384SChuck Lever 0x48, 0x07, 0xef, 0xe8, 0x36, 0xee, 0x89, 0xa5, 650e1a9a384SChuck Lever 0x26, 0x73, 0x0d, 0xbc, 0x2f, 0x7b, 0xc8, 0x40, 651e1a9a384SChuck Lever 0x9d, 0xad, 0x8b, 0xbb, 0x96, 0xc4, 0xcd, 0xc0, 652e1a9a384SChuck Lever 0x3b, 0xc1, 0x03, 0xe1, 0xa1, 0x94, 0xbb, 0xd8 653e1a9a384SChuck Lever ); 654e1a9a384SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc3962_enc_test6_next_iv, 655e1a9a384SChuck Lever 0x48, 0x07, 0xef, 0xe8, 0x36, 0xee, 0x89, 0xa5, 656e1a9a384SChuck Lever 0x26, 0x73, 0x0d, 0xbc, 0x2f, 0x7b, 0xc8, 0x40 657e1a9a384SChuck Lever ); 658e1a9a384SChuck Lever 659e1a9a384SChuck Lever static const struct gss_krb5_test_param rfc3962_encrypt_test_params[] = { 660e1a9a384SChuck Lever { 661e1a9a384SChuck Lever .desc = "Encrypt with aes128-cts-hmac-sha1-96 case 1", 662e1a9a384SChuck Lever .enctype = ENCTYPE_AES128_CTS_HMAC_SHA1_96, 663e1a9a384SChuck Lever .Ke = &rfc3962_encryption_key, 664e1a9a384SChuck Lever .plaintext = &rfc3962_enc_test1_plaintext, 665e1a9a384SChuck Lever .expected_result = &rfc3962_enc_test1_expected_result, 666e1a9a384SChuck Lever .next_iv = &rfc3962_enc_test1_next_iv, 667e1a9a384SChuck Lever }, 668e1a9a384SChuck Lever { 669e1a9a384SChuck Lever .desc = "Encrypt with aes128-cts-hmac-sha1-96 case 2", 670e1a9a384SChuck Lever .enctype = ENCTYPE_AES128_CTS_HMAC_SHA1_96, 671e1a9a384SChuck Lever .Ke = &rfc3962_encryption_key, 672e1a9a384SChuck Lever .plaintext = &rfc3962_enc_test2_plaintext, 673e1a9a384SChuck Lever .expected_result = &rfc3962_enc_test2_expected_result, 674e1a9a384SChuck Lever .next_iv = &rfc3962_enc_test2_next_iv, 675e1a9a384SChuck Lever }, 676e1a9a384SChuck Lever { 677e1a9a384SChuck Lever .desc = "Encrypt with aes128-cts-hmac-sha1-96 case 3", 678e1a9a384SChuck Lever .enctype = ENCTYPE_AES128_CTS_HMAC_SHA1_96, 679e1a9a384SChuck Lever .Ke = &rfc3962_encryption_key, 680e1a9a384SChuck Lever .plaintext = &rfc3962_enc_test3_plaintext, 681e1a9a384SChuck Lever .expected_result = &rfc3962_enc_test3_expected_result, 682e1a9a384SChuck Lever .next_iv = &rfc3962_enc_test3_next_iv, 683e1a9a384SChuck Lever }, 684e1a9a384SChuck Lever { 685e1a9a384SChuck Lever .desc = "Encrypt with aes128-cts-hmac-sha1-96 case 4", 686e1a9a384SChuck Lever .enctype = ENCTYPE_AES128_CTS_HMAC_SHA1_96, 687e1a9a384SChuck Lever .Ke = &rfc3962_encryption_key, 688e1a9a384SChuck Lever .plaintext = &rfc3962_enc_test4_plaintext, 689e1a9a384SChuck Lever .expected_result = &rfc3962_enc_test4_expected_result, 690e1a9a384SChuck Lever .next_iv = &rfc3962_enc_test4_next_iv, 691e1a9a384SChuck Lever }, 692e1a9a384SChuck Lever { 693e1a9a384SChuck Lever .desc = "Encrypt with aes128-cts-hmac-sha1-96 case 5", 694e1a9a384SChuck Lever .enctype = ENCTYPE_AES128_CTS_HMAC_SHA1_96, 695e1a9a384SChuck Lever .Ke = &rfc3962_encryption_key, 696e1a9a384SChuck Lever .plaintext = &rfc3962_enc_test5_plaintext, 697e1a9a384SChuck Lever .expected_result = &rfc3962_enc_test5_expected_result, 698e1a9a384SChuck Lever .next_iv = &rfc3962_enc_test5_next_iv, 699e1a9a384SChuck Lever }, 700e1a9a384SChuck Lever { 701e1a9a384SChuck Lever .desc = "Encrypt with aes128-cts-hmac-sha1-96 case 6", 702e1a9a384SChuck Lever .enctype = ENCTYPE_AES128_CTS_HMAC_SHA1_96, 703e1a9a384SChuck Lever .Ke = &rfc3962_encryption_key, 704e1a9a384SChuck Lever .plaintext = &rfc3962_enc_test6_plaintext, 705e1a9a384SChuck Lever .expected_result = &rfc3962_enc_test6_expected_result, 706e1a9a384SChuck Lever .next_iv = &rfc3962_enc_test6_next_iv, 707e1a9a384SChuck Lever }, 708e1a9a384SChuck Lever }; 709e1a9a384SChuck Lever 710e1a9a384SChuck Lever /* Creates the function rfc3962_encrypt_gen_params */ 711e1a9a384SChuck Lever KUNIT_ARRAY_PARAM(rfc3962_encrypt, rfc3962_encrypt_test_params, 712e1a9a384SChuck Lever gss_krb5_get_desc); 713e1a9a384SChuck Lever 714e1a9a384SChuck Lever /* 715e1a9a384SChuck Lever * This tests the implementation of the encryption part of the mechanism. 716e1a9a384SChuck Lever * It does not apply a confounder or test the result of HMAC over the 717e1a9a384SChuck Lever * plaintext. 718e1a9a384SChuck Lever */ 719e1a9a384SChuck Lever static void rfc3962_encrypt_case(struct kunit *test) 720e1a9a384SChuck Lever { 721e1a9a384SChuck Lever const struct gss_krb5_test_param *param = test->param_value; 722e1a9a384SChuck Lever struct crypto_sync_skcipher *cts_tfm, *cbc_tfm; 723e1a9a384SChuck Lever const struct gss_krb5_enctype *gk5e; 724e1a9a384SChuck Lever struct xdr_buf buf; 725e1a9a384SChuck Lever void *iv, *text; 726e1a9a384SChuck Lever u32 err; 727e1a9a384SChuck Lever 728e1a9a384SChuck Lever /* Arrange */ 729e1a9a384SChuck Lever gk5e = gss_krb5_lookup_enctype(param->enctype); 730*fe90151cSChuck Lever if (!gk5e) 731*fe90151cSChuck Lever kunit_skip(test, "Encryption type is not available"); 732e1a9a384SChuck Lever 733e1a9a384SChuck Lever cbc_tfm = crypto_alloc_sync_skcipher(gk5e->aux_cipher, 0, 0); 734e1a9a384SChuck Lever KUNIT_ASSERT_NOT_ERR_OR_NULL(test, cbc_tfm); 735e1a9a384SChuck Lever err = crypto_sync_skcipher_setkey(cbc_tfm, param->Ke->data, param->Ke->len); 736e1a9a384SChuck Lever KUNIT_ASSERT_EQ(test, err, 0); 737e1a9a384SChuck Lever 738e1a9a384SChuck Lever cts_tfm = crypto_alloc_sync_skcipher(gk5e->encrypt_name, 0, 0); 739e1a9a384SChuck Lever KUNIT_ASSERT_NOT_ERR_OR_NULL(test, cts_tfm); 740e1a9a384SChuck Lever err = crypto_sync_skcipher_setkey(cts_tfm, param->Ke->data, param->Ke->len); 741e1a9a384SChuck Lever KUNIT_ASSERT_EQ(test, err, 0); 742e1a9a384SChuck Lever 743e1a9a384SChuck Lever iv = kunit_kzalloc(test, crypto_sync_skcipher_ivsize(cts_tfm), GFP_KERNEL); 744e1a9a384SChuck Lever KUNIT_ASSERT_NOT_ERR_OR_NULL(test, iv); 745e1a9a384SChuck Lever 746e1a9a384SChuck Lever text = kunit_kzalloc(test, param->plaintext->len, GFP_KERNEL); 747e1a9a384SChuck Lever KUNIT_ASSERT_NOT_ERR_OR_NULL(test, text); 748e1a9a384SChuck Lever 749e1a9a384SChuck Lever memcpy(text, param->plaintext->data, param->plaintext->len); 750e1a9a384SChuck Lever memset(&buf, 0, sizeof(buf)); 751e1a9a384SChuck Lever buf.head[0].iov_base = text; 752e1a9a384SChuck Lever buf.head[0].iov_len = param->plaintext->len; 753e1a9a384SChuck Lever buf.len = buf.head[0].iov_len; 754e1a9a384SChuck Lever 755e1a9a384SChuck Lever /* Act */ 756e1a9a384SChuck Lever err = krb5_cbc_cts_encrypt(cts_tfm, cbc_tfm, 0, &buf, NULL, 757e1a9a384SChuck Lever iv, crypto_sync_skcipher_ivsize(cts_tfm)); 758e1a9a384SChuck Lever KUNIT_ASSERT_EQ(test, err, 0); 759e1a9a384SChuck Lever 760e1a9a384SChuck Lever /* Assert */ 761e1a9a384SChuck Lever KUNIT_EXPECT_EQ_MSG(test, 762e1a9a384SChuck Lever param->expected_result->len, buf.len, 763e1a9a384SChuck Lever "ciphertext length mismatch"); 764e1a9a384SChuck Lever KUNIT_EXPECT_EQ_MSG(test, 765e1a9a384SChuck Lever memcmp(param->expected_result->data, 766e1a9a384SChuck Lever text, param->expected_result->len), 0, 767e1a9a384SChuck Lever "ciphertext mismatch"); 768e1a9a384SChuck Lever KUNIT_EXPECT_EQ_MSG(test, 769e1a9a384SChuck Lever memcmp(param->next_iv->data, iv, 770e1a9a384SChuck Lever param->next_iv->len), 0, 771e1a9a384SChuck Lever "IV mismatch"); 772e1a9a384SChuck Lever 773e1a9a384SChuck Lever crypto_free_sync_skcipher(cts_tfm); 774e1a9a384SChuck Lever crypto_free_sync_skcipher(cbc_tfm); 775e1a9a384SChuck Lever } 776e1a9a384SChuck Lever 777e1a9a384SChuck Lever static struct kunit_case rfc3962_test_cases[] = { 778e1a9a384SChuck Lever { 779e1a9a384SChuck Lever .name = "RFC 3962 encryption", 780e1a9a384SChuck Lever .run_case = rfc3962_encrypt_case, 781e1a9a384SChuck Lever .generate_params = rfc3962_encrypt_gen_params, 782e1a9a384SChuck Lever }, 783e1a9a384SChuck Lever }; 784e1a9a384SChuck Lever 785e1a9a384SChuck Lever static struct kunit_suite rfc3962_suite = { 786e1a9a384SChuck Lever .name = "RFC 3962 suite", 787e1a9a384SChuck Lever .test_cases = rfc3962_test_cases, 788e1a9a384SChuck Lever }; 789e1a9a384SChuck Lever 79035f6e42eSChuck Lever /* 79135f6e42eSChuck Lever * From RFC 6803 Section 10. Test vectors 79235f6e42eSChuck Lever * 79335f6e42eSChuck Lever * Sample results for key derivation 79435f6e42eSChuck Lever * 79535f6e42eSChuck Lever * Copyright (c) 2012 IETF Trust and the persons identified as the 79635f6e42eSChuck Lever * document authors. All rights reserved. 79735f6e42eSChuck Lever */ 79835f6e42eSChuck Lever 79935f6e42eSChuck Lever DEFINE_HEX_XDR_NETOBJ(camellia128_cts_cmac_basekey, 80035f6e42eSChuck Lever 0x57, 0xd0, 0x29, 0x72, 0x98, 0xff, 0xd9, 0xd3, 80135f6e42eSChuck Lever 0x5d, 0xe5, 0xa4, 0x7f, 0xb4, 0xbd, 0xe2, 0x4b 80235f6e42eSChuck Lever ); 80335f6e42eSChuck Lever DEFINE_HEX_XDR_NETOBJ(camellia128_cts_cmac_Kc, 80435f6e42eSChuck Lever 0xd1, 0x55, 0x77, 0x5a, 0x20, 0x9d, 0x05, 0xf0, 80535f6e42eSChuck Lever 0x2b, 0x38, 0xd4, 0x2a, 0x38, 0x9e, 0x5a, 0x56 80635f6e42eSChuck Lever ); 80735f6e42eSChuck Lever DEFINE_HEX_XDR_NETOBJ(camellia128_cts_cmac_Ke, 80835f6e42eSChuck Lever 0x64, 0xdf, 0x83, 0xf8, 0x5a, 0x53, 0x2f, 0x17, 80935f6e42eSChuck Lever 0x57, 0x7d, 0x8c, 0x37, 0x03, 0x57, 0x96, 0xab 81035f6e42eSChuck Lever ); 81135f6e42eSChuck Lever DEFINE_HEX_XDR_NETOBJ(camellia128_cts_cmac_Ki, 81235f6e42eSChuck Lever 0x3e, 0x4f, 0xbd, 0xf3, 0x0f, 0xb8, 0x25, 0x9c, 81335f6e42eSChuck Lever 0x42, 0x5c, 0xb6, 0xc9, 0x6f, 0x1f, 0x46, 0x35 81435f6e42eSChuck Lever ); 81535f6e42eSChuck Lever 81635f6e42eSChuck Lever DEFINE_HEX_XDR_NETOBJ(camellia256_cts_cmac_basekey, 81735f6e42eSChuck Lever 0xb9, 0xd6, 0x82, 0x8b, 0x20, 0x56, 0xb7, 0xbe, 81835f6e42eSChuck Lever 0x65, 0x6d, 0x88, 0xa1, 0x23, 0xb1, 0xfa, 0xc6, 81935f6e42eSChuck Lever 0x82, 0x14, 0xac, 0x2b, 0x72, 0x7e, 0xcf, 0x5f, 82035f6e42eSChuck Lever 0x69, 0xaf, 0xe0, 0xc4, 0xdf, 0x2a, 0x6d, 0x2c 82135f6e42eSChuck Lever ); 82235f6e42eSChuck Lever DEFINE_HEX_XDR_NETOBJ(camellia256_cts_cmac_Kc, 82335f6e42eSChuck Lever 0xe4, 0x67, 0xf9, 0xa9, 0x55, 0x2b, 0xc7, 0xd3, 82435f6e42eSChuck Lever 0x15, 0x5a, 0x62, 0x20, 0xaf, 0x9c, 0x19, 0x22, 82535f6e42eSChuck Lever 0x0e, 0xee, 0xd4, 0xff, 0x78, 0xb0, 0xd1, 0xe6, 82635f6e42eSChuck Lever 0xa1, 0x54, 0x49, 0x91, 0x46, 0x1a, 0x9e, 0x50 82735f6e42eSChuck Lever ); 82835f6e42eSChuck Lever DEFINE_HEX_XDR_NETOBJ(camellia256_cts_cmac_Ke, 82935f6e42eSChuck Lever 0x41, 0x2a, 0xef, 0xc3, 0x62, 0xa7, 0x28, 0x5f, 83035f6e42eSChuck Lever 0xc3, 0x96, 0x6c, 0x6a, 0x51, 0x81, 0xe7, 0x60, 83135f6e42eSChuck Lever 0x5a, 0xe6, 0x75, 0x23, 0x5b, 0x6d, 0x54, 0x9f, 83235f6e42eSChuck Lever 0xbf, 0xc9, 0xab, 0x66, 0x30, 0xa4, 0xc6, 0x04 83335f6e42eSChuck Lever ); 83435f6e42eSChuck Lever DEFINE_HEX_XDR_NETOBJ(camellia256_cts_cmac_Ki, 83535f6e42eSChuck Lever 0xfa, 0x62, 0x4f, 0xa0, 0xe5, 0x23, 0x99, 0x3f, 83635f6e42eSChuck Lever 0xa3, 0x88, 0xae, 0xfd, 0xc6, 0x7e, 0x67, 0xeb, 83735f6e42eSChuck Lever 0xcd, 0x8c, 0x08, 0xe8, 0xa0, 0x24, 0x6b, 0x1d, 83835f6e42eSChuck Lever 0x73, 0xb0, 0xd1, 0xdd, 0x9f, 0xc5, 0x82, 0xb0 83935f6e42eSChuck Lever ); 84035f6e42eSChuck Lever 84135f6e42eSChuck Lever DEFINE_HEX_XDR_NETOBJ(usage_checksum, 84235f6e42eSChuck Lever 0x00, 0x00, 0x00, 0x02, KEY_USAGE_SEED_CHECKSUM 84335f6e42eSChuck Lever ); 84435f6e42eSChuck Lever DEFINE_HEX_XDR_NETOBJ(usage_encryption, 84535f6e42eSChuck Lever 0x00, 0x00, 0x00, 0x02, KEY_USAGE_SEED_ENCRYPTION 84635f6e42eSChuck Lever ); 84735f6e42eSChuck Lever DEFINE_HEX_XDR_NETOBJ(usage_integrity, 84835f6e42eSChuck Lever 0x00, 0x00, 0x00, 0x02, KEY_USAGE_SEED_INTEGRITY 84935f6e42eSChuck Lever ); 85035f6e42eSChuck Lever 85135f6e42eSChuck Lever static const struct gss_krb5_test_param rfc6803_kdf_test_params[] = { 85235f6e42eSChuck Lever { 85335f6e42eSChuck Lever .desc = "Derive Kc subkey for camellia128-cts-cmac", 85435f6e42eSChuck Lever .enctype = ENCTYPE_CAMELLIA128_CTS_CMAC, 85535f6e42eSChuck Lever .base_key = &camellia128_cts_cmac_basekey, 85635f6e42eSChuck Lever .usage = &usage_checksum, 85735f6e42eSChuck Lever .expected_result = &camellia128_cts_cmac_Kc, 85835f6e42eSChuck Lever }, 85935f6e42eSChuck Lever { 86035f6e42eSChuck Lever .desc = "Derive Ke subkey for camellia128-cts-cmac", 86135f6e42eSChuck Lever .enctype = ENCTYPE_CAMELLIA128_CTS_CMAC, 86235f6e42eSChuck Lever .base_key = &camellia128_cts_cmac_basekey, 86335f6e42eSChuck Lever .usage = &usage_encryption, 86435f6e42eSChuck Lever .expected_result = &camellia128_cts_cmac_Ke, 86535f6e42eSChuck Lever }, 86635f6e42eSChuck Lever { 86735f6e42eSChuck Lever .desc = "Derive Ki subkey for camellia128-cts-cmac", 86835f6e42eSChuck Lever .enctype = ENCTYPE_CAMELLIA128_CTS_CMAC, 86935f6e42eSChuck Lever .base_key = &camellia128_cts_cmac_basekey, 87035f6e42eSChuck Lever .usage = &usage_integrity, 87135f6e42eSChuck Lever .expected_result = &camellia128_cts_cmac_Ki, 87235f6e42eSChuck Lever }, 87335f6e42eSChuck Lever { 87435f6e42eSChuck Lever .desc = "Derive Kc subkey for camellia256-cts-cmac", 87535f6e42eSChuck Lever .enctype = ENCTYPE_CAMELLIA256_CTS_CMAC, 87635f6e42eSChuck Lever .base_key = &camellia256_cts_cmac_basekey, 87735f6e42eSChuck Lever .usage = &usage_checksum, 87835f6e42eSChuck Lever .expected_result = &camellia256_cts_cmac_Kc, 87935f6e42eSChuck Lever }, 88035f6e42eSChuck Lever { 88135f6e42eSChuck Lever .desc = "Derive Ke subkey for camellia256-cts-cmac", 88235f6e42eSChuck Lever .enctype = ENCTYPE_CAMELLIA256_CTS_CMAC, 88335f6e42eSChuck Lever .base_key = &camellia256_cts_cmac_basekey, 88435f6e42eSChuck Lever .usage = &usage_encryption, 88535f6e42eSChuck Lever .expected_result = &camellia256_cts_cmac_Ke, 88635f6e42eSChuck Lever }, 88735f6e42eSChuck Lever { 88835f6e42eSChuck Lever .desc = "Derive Ki subkey for camellia256-cts-cmac", 88935f6e42eSChuck Lever .enctype = ENCTYPE_CAMELLIA256_CTS_CMAC, 89035f6e42eSChuck Lever .base_key = &camellia256_cts_cmac_basekey, 89135f6e42eSChuck Lever .usage = &usage_integrity, 89235f6e42eSChuck Lever .expected_result = &camellia256_cts_cmac_Ki, 89335f6e42eSChuck Lever }, 89435f6e42eSChuck Lever }; 89535f6e42eSChuck Lever 89635f6e42eSChuck Lever /* Creates the function rfc6803_kdf_gen_params */ 89735f6e42eSChuck Lever KUNIT_ARRAY_PARAM(rfc6803_kdf, rfc6803_kdf_test_params, gss_krb5_get_desc); 89835f6e42eSChuck Lever 89902142b2cSChuck Lever /* 90002142b2cSChuck Lever * From RFC 6803 Section 10. Test vectors 90102142b2cSChuck Lever * 90202142b2cSChuck Lever * Sample checksums. 90302142b2cSChuck Lever * 90402142b2cSChuck Lever * Copyright (c) 2012 IETF Trust and the persons identified as the 90502142b2cSChuck Lever * document authors. All rights reserved. 90602142b2cSChuck Lever * 90702142b2cSChuck Lever * XXX: These tests are likely to fail on EBCDIC or Unicode platforms. 90802142b2cSChuck Lever */ 90902142b2cSChuck Lever DEFINE_STR_XDR_NETOBJ(rfc6803_checksum_test1_plaintext, 91002142b2cSChuck Lever "abcdefghijk"); 91102142b2cSChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc6803_checksum_test1_basekey, 91202142b2cSChuck Lever 0x1d, 0xc4, 0x6a, 0x8d, 0x76, 0x3f, 0x4f, 0x93, 91302142b2cSChuck Lever 0x74, 0x2b, 0xcb, 0xa3, 0x38, 0x75, 0x76, 0xc3 91402142b2cSChuck Lever ); 91502142b2cSChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc6803_checksum_test1_usage, 91602142b2cSChuck Lever 0x00, 0x00, 0x00, 0x07, KEY_USAGE_SEED_CHECKSUM 91702142b2cSChuck Lever ); 91802142b2cSChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc6803_checksum_test1_expected_result, 91902142b2cSChuck Lever 0x11, 0x78, 0xe6, 0xc5, 0xc4, 0x7a, 0x8c, 0x1a, 92002142b2cSChuck Lever 0xe0, 0xc4, 0xb9, 0xc7, 0xd4, 0xeb, 0x7b, 0x6b 92102142b2cSChuck Lever ); 92202142b2cSChuck Lever 92302142b2cSChuck Lever DEFINE_STR_XDR_NETOBJ(rfc6803_checksum_test2_plaintext, 92402142b2cSChuck Lever "ABCDEFGHIJKLMNOPQRSTUVWXYZ"); 92502142b2cSChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc6803_checksum_test2_basekey, 92602142b2cSChuck Lever 0x50, 0x27, 0xbc, 0x23, 0x1d, 0x0f, 0x3a, 0x9d, 92702142b2cSChuck Lever 0x23, 0x33, 0x3f, 0x1c, 0xa6, 0xfd, 0xbe, 0x7c 92802142b2cSChuck Lever ); 92902142b2cSChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc6803_checksum_test2_usage, 93002142b2cSChuck Lever 0x00, 0x00, 0x00, 0x08, KEY_USAGE_SEED_CHECKSUM 93102142b2cSChuck Lever ); 93202142b2cSChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc6803_checksum_test2_expected_result, 93302142b2cSChuck Lever 0xd1, 0xb3, 0x4f, 0x70, 0x04, 0xa7, 0x31, 0xf2, 93402142b2cSChuck Lever 0x3a, 0x0c, 0x00, 0xbf, 0x6c, 0x3f, 0x75, 0x3a 93502142b2cSChuck Lever ); 93602142b2cSChuck Lever 93702142b2cSChuck Lever DEFINE_STR_XDR_NETOBJ(rfc6803_checksum_test3_plaintext, 93802142b2cSChuck Lever "123456789"); 93902142b2cSChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc6803_checksum_test3_basekey, 94002142b2cSChuck Lever 0xb6, 0x1c, 0x86, 0xcc, 0x4e, 0x5d, 0x27, 0x57, 94102142b2cSChuck Lever 0x54, 0x5a, 0xd4, 0x23, 0x39, 0x9f, 0xb7, 0x03, 94202142b2cSChuck Lever 0x1e, 0xca, 0xb9, 0x13, 0xcb, 0xb9, 0x00, 0xbd, 94302142b2cSChuck Lever 0x7a, 0x3c, 0x6d, 0xd8, 0xbf, 0x92, 0x01, 0x5b 94402142b2cSChuck Lever ); 94502142b2cSChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc6803_checksum_test3_usage, 94602142b2cSChuck Lever 0x00, 0x00, 0x00, 0x09, KEY_USAGE_SEED_CHECKSUM 94702142b2cSChuck Lever ); 94802142b2cSChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc6803_checksum_test3_expected_result, 94902142b2cSChuck Lever 0x87, 0xa1, 0x2c, 0xfd, 0x2b, 0x96, 0x21, 0x48, 95002142b2cSChuck Lever 0x10, 0xf0, 0x1c, 0x82, 0x6e, 0x77, 0x44, 0xb1 95102142b2cSChuck Lever ); 95202142b2cSChuck Lever 95302142b2cSChuck Lever DEFINE_STR_XDR_NETOBJ(rfc6803_checksum_test4_plaintext, 95402142b2cSChuck Lever "!@#$%^&*()!@#$%^&*()!@#$%^&*()"); 95502142b2cSChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc6803_checksum_test4_basekey, 95602142b2cSChuck Lever 0x32, 0x16, 0x4c, 0x5b, 0x43, 0x4d, 0x1d, 0x15, 95702142b2cSChuck Lever 0x38, 0xe4, 0xcf, 0xd9, 0xbe, 0x80, 0x40, 0xfe, 95802142b2cSChuck Lever 0x8c, 0x4a, 0xc7, 0xac, 0xc4, 0xb9, 0x3d, 0x33, 95902142b2cSChuck Lever 0x14, 0xd2, 0x13, 0x36, 0x68, 0x14, 0x7a, 0x05 96002142b2cSChuck Lever ); 96102142b2cSChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc6803_checksum_test4_usage, 96202142b2cSChuck Lever 0x00, 0x00, 0x00, 0x0a, KEY_USAGE_SEED_CHECKSUM 96302142b2cSChuck Lever ); 96402142b2cSChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc6803_checksum_test4_expected_result, 96502142b2cSChuck Lever 0x3f, 0xa0, 0xb4, 0x23, 0x55, 0xe5, 0x2b, 0x18, 96602142b2cSChuck Lever 0x91, 0x87, 0x29, 0x4a, 0xa2, 0x52, 0xab, 0x64 96702142b2cSChuck Lever ); 96802142b2cSChuck Lever 96902142b2cSChuck Lever static const struct gss_krb5_test_param rfc6803_checksum_test_params[] = { 97002142b2cSChuck Lever { 97102142b2cSChuck Lever .desc = "camellia128-cts-cmac checksum test 1", 97202142b2cSChuck Lever .enctype = ENCTYPE_CAMELLIA128_CTS_CMAC, 97302142b2cSChuck Lever .base_key = &rfc6803_checksum_test1_basekey, 97402142b2cSChuck Lever .usage = &rfc6803_checksum_test1_usage, 97502142b2cSChuck Lever .plaintext = &rfc6803_checksum_test1_plaintext, 97602142b2cSChuck Lever .expected_result = &rfc6803_checksum_test1_expected_result, 97702142b2cSChuck Lever }, 97802142b2cSChuck Lever { 97902142b2cSChuck Lever .desc = "camellia128-cts-cmac checksum test 2", 98002142b2cSChuck Lever .enctype = ENCTYPE_CAMELLIA128_CTS_CMAC, 98102142b2cSChuck Lever .base_key = &rfc6803_checksum_test2_basekey, 98202142b2cSChuck Lever .usage = &rfc6803_checksum_test2_usage, 98302142b2cSChuck Lever .plaintext = &rfc6803_checksum_test2_plaintext, 98402142b2cSChuck Lever .expected_result = &rfc6803_checksum_test2_expected_result, 98502142b2cSChuck Lever }, 98602142b2cSChuck Lever { 98702142b2cSChuck Lever .desc = "camellia256-cts-cmac checksum test 3", 98802142b2cSChuck Lever .enctype = ENCTYPE_CAMELLIA256_CTS_CMAC, 98902142b2cSChuck Lever .base_key = &rfc6803_checksum_test3_basekey, 99002142b2cSChuck Lever .usage = &rfc6803_checksum_test3_usage, 99102142b2cSChuck Lever .plaintext = &rfc6803_checksum_test3_plaintext, 99202142b2cSChuck Lever .expected_result = &rfc6803_checksum_test3_expected_result, 99302142b2cSChuck Lever }, 99402142b2cSChuck Lever { 99502142b2cSChuck Lever .desc = "camellia256-cts-cmac checksum test 4", 99602142b2cSChuck Lever .enctype = ENCTYPE_CAMELLIA256_CTS_CMAC, 99702142b2cSChuck Lever .base_key = &rfc6803_checksum_test4_basekey, 99802142b2cSChuck Lever .usage = &rfc6803_checksum_test4_usage, 99902142b2cSChuck Lever .plaintext = &rfc6803_checksum_test4_plaintext, 100002142b2cSChuck Lever .expected_result = &rfc6803_checksum_test4_expected_result, 100102142b2cSChuck Lever }, 100202142b2cSChuck Lever }; 100302142b2cSChuck Lever 100402142b2cSChuck Lever /* Creates the function rfc6803_checksum_gen_params */ 100502142b2cSChuck Lever KUNIT_ARRAY_PARAM(rfc6803_checksum, rfc6803_checksum_test_params, 100602142b2cSChuck Lever gss_krb5_get_desc); 100702142b2cSChuck Lever 1008b958cff6SChuck Lever /* 1009b958cff6SChuck Lever * From RFC 6803 Section 10. Test vectors 1010b958cff6SChuck Lever * 1011b958cff6SChuck Lever * Sample encryptions (all using the default cipher state) 1012b958cff6SChuck Lever * 1013b958cff6SChuck Lever * Copyright (c) 2012 IETF Trust and the persons identified as the 1014b958cff6SChuck Lever * document authors. All rights reserved. 1015b958cff6SChuck Lever * 1016b958cff6SChuck Lever * Key usage values are from errata 4326 against RFC 6803. 1017b958cff6SChuck Lever */ 1018b958cff6SChuck Lever 1019b958cff6SChuck Lever static const struct xdr_netobj rfc6803_enc_empty_plaintext = { 1020b958cff6SChuck Lever .len = 0, 1021b958cff6SChuck Lever }; 1022b958cff6SChuck Lever 1023b958cff6SChuck Lever DEFINE_STR_XDR_NETOBJ(rfc6803_enc_1byte_plaintext, "1"); 1024b958cff6SChuck Lever DEFINE_STR_XDR_NETOBJ(rfc6803_enc_9byte_plaintext, "9 bytesss"); 1025b958cff6SChuck Lever DEFINE_STR_XDR_NETOBJ(rfc6803_enc_13byte_plaintext, "13 bytes byte"); 1026b958cff6SChuck Lever DEFINE_STR_XDR_NETOBJ(rfc6803_enc_30byte_plaintext, 1027b958cff6SChuck Lever "30 bytes bytes bytes bytes byt" 1028b958cff6SChuck Lever ); 1029b958cff6SChuck Lever 1030b958cff6SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test1_confounder, 1031b958cff6SChuck Lever 0xb6, 0x98, 0x22, 0xa1, 0x9a, 0x6b, 0x09, 0xc0, 1032b958cff6SChuck Lever 0xeb, 0xc8, 0x55, 0x7d, 0x1f, 0x1b, 0x6c, 0x0a 1033b958cff6SChuck Lever ); 1034b958cff6SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test1_basekey, 1035b958cff6SChuck Lever 0x1d, 0xc4, 0x6a, 0x8d, 0x76, 0x3f, 0x4f, 0x93, 1036b958cff6SChuck Lever 0x74, 0x2b, 0xcb, 0xa3, 0x38, 0x75, 0x76, 0xc3 1037b958cff6SChuck Lever ); 1038b958cff6SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test1_expected_result, 1039b958cff6SChuck Lever 0xc4, 0x66, 0xf1, 0x87, 0x10, 0x69, 0x92, 0x1e, 1040b958cff6SChuck Lever 0xdb, 0x7c, 0x6f, 0xde, 0x24, 0x4a, 0x52, 0xdb, 1041b958cff6SChuck Lever 0x0b, 0xa1, 0x0e, 0xdc, 0x19, 0x7b, 0xdb, 0x80, 1042b958cff6SChuck Lever 0x06, 0x65, 0x8c, 0xa3, 0xcc, 0xce, 0x6e, 0xb8 1043b958cff6SChuck Lever ); 1044b958cff6SChuck Lever 1045b958cff6SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test2_confounder, 1046b958cff6SChuck Lever 0x6f, 0x2f, 0xc3, 0xc2, 0xa1, 0x66, 0xfd, 0x88, 1047b958cff6SChuck Lever 0x98, 0x96, 0x7a, 0x83, 0xde, 0x95, 0x96, 0xd9 1048b958cff6SChuck Lever ); 1049b958cff6SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test2_basekey, 1050b958cff6SChuck Lever 0x50, 0x27, 0xbc, 0x23, 0x1d, 0x0f, 0x3a, 0x9d, 1051b958cff6SChuck Lever 0x23, 0x33, 0x3f, 0x1c, 0xa6, 0xfd, 0xbe, 0x7c 1052b958cff6SChuck Lever ); 1053b958cff6SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test2_expected_result, 1054b958cff6SChuck Lever 0x84, 0x2d, 0x21, 0xfd, 0x95, 0x03, 0x11, 0xc0, 1055b958cff6SChuck Lever 0xdd, 0x46, 0x4a, 0x3f, 0x4b, 0xe8, 0xd6, 0xda, 1056b958cff6SChuck Lever 0x88, 0xa5, 0x6d, 0x55, 0x9c, 0x9b, 0x47, 0xd3, 1057b958cff6SChuck Lever 0xf9, 0xa8, 0x50, 0x67, 0xaf, 0x66, 0x15, 0x59, 1058b958cff6SChuck Lever 0xb8 1059b958cff6SChuck Lever ); 1060b958cff6SChuck Lever 1061b958cff6SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test3_confounder, 1062b958cff6SChuck Lever 0xa5, 0xb4, 0xa7, 0x1e, 0x07, 0x7a, 0xee, 0xf9, 1063b958cff6SChuck Lever 0x3c, 0x87, 0x63, 0xc1, 0x8f, 0xdb, 0x1f, 0x10 1064b958cff6SChuck Lever ); 1065b958cff6SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test3_basekey, 1066b958cff6SChuck Lever 0xa1, 0xbb, 0x61, 0xe8, 0x05, 0xf9, 0xba, 0x6d, 1067b958cff6SChuck Lever 0xde, 0x8f, 0xdb, 0xdd, 0xc0, 0x5c, 0xde, 0xa0 1068b958cff6SChuck Lever ); 1069b958cff6SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test3_expected_result, 1070b958cff6SChuck Lever 0x61, 0x9f, 0xf0, 0x72, 0xe3, 0x62, 0x86, 0xff, 1071b958cff6SChuck Lever 0x0a, 0x28, 0xde, 0xb3, 0xa3, 0x52, 0xec, 0x0d, 1072b958cff6SChuck Lever 0x0e, 0xdf, 0x5c, 0x51, 0x60, 0xd6, 0x63, 0xc9, 1073b958cff6SChuck Lever 0x01, 0x75, 0x8c, 0xcf, 0x9d, 0x1e, 0xd3, 0x3d, 1074b958cff6SChuck Lever 0x71, 0xdb, 0x8f, 0x23, 0xaa, 0xbf, 0x83, 0x48, 1075b958cff6SChuck Lever 0xa0 1076b958cff6SChuck Lever ); 1077b958cff6SChuck Lever 1078b958cff6SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test4_confounder, 1079b958cff6SChuck Lever 0x19, 0xfe, 0xe4, 0x0d, 0x81, 0x0c, 0x52, 0x4b, 1080b958cff6SChuck Lever 0x5b, 0x22, 0xf0, 0x18, 0x74, 0xc6, 0x93, 0xda 1081b958cff6SChuck Lever ); 1082b958cff6SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test4_basekey, 1083b958cff6SChuck Lever 0x2c, 0xa2, 0x7a, 0x5f, 0xaf, 0x55, 0x32, 0x24, 1084b958cff6SChuck Lever 0x45, 0x06, 0x43, 0x4e, 0x1c, 0xef, 0x66, 0x76 1085b958cff6SChuck Lever ); 1086b958cff6SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test4_expected_result, 1087b958cff6SChuck Lever 0xb8, 0xec, 0xa3, 0x16, 0x7a, 0xe6, 0x31, 0x55, 1088b958cff6SChuck Lever 0x12, 0xe5, 0x9f, 0x98, 0xa7, 0xc5, 0x00, 0x20, 1089b958cff6SChuck Lever 0x5e, 0x5f, 0x63, 0xff, 0x3b, 0xb3, 0x89, 0xaf, 1090b958cff6SChuck Lever 0x1c, 0x41, 0xa2, 0x1d, 0x64, 0x0d, 0x86, 0x15, 1091b958cff6SChuck Lever 0xc9, 0xed, 0x3f, 0xbe, 0xb0, 0x5a, 0xb6, 0xac, 1092b958cff6SChuck Lever 0xb6, 0x76, 0x89, 0xb5, 0xea 1093b958cff6SChuck Lever ); 1094b958cff6SChuck Lever 1095b958cff6SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test5_confounder, 1096b958cff6SChuck Lever 0xca, 0x7a, 0x7a, 0xb4, 0xbe, 0x19, 0x2d, 0xab, 1097b958cff6SChuck Lever 0xd6, 0x03, 0x50, 0x6d, 0xb1, 0x9c, 0x39, 0xe2 1098b958cff6SChuck Lever ); 1099b958cff6SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test5_basekey, 1100b958cff6SChuck Lever 0x78, 0x24, 0xf8, 0xc1, 0x6f, 0x83, 0xff, 0x35, 1101b958cff6SChuck Lever 0x4c, 0x6b, 0xf7, 0x51, 0x5b, 0x97, 0x3f, 0x43 1102b958cff6SChuck Lever ); 1103b958cff6SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test5_expected_result, 1104b958cff6SChuck Lever 0xa2, 0x6a, 0x39, 0x05, 0xa4, 0xff, 0xd5, 0x81, 1105b958cff6SChuck Lever 0x6b, 0x7b, 0x1e, 0x27, 0x38, 0x0d, 0x08, 0x09, 1106b958cff6SChuck Lever 0x0c, 0x8e, 0xc1, 0xf3, 0x04, 0x49, 0x6e, 0x1a, 1107b958cff6SChuck Lever 0xbd, 0xcd, 0x2b, 0xdc, 0xd1, 0xdf, 0xfc, 0x66, 1108b958cff6SChuck Lever 0x09, 0x89, 0xe1, 0x17, 0xa7, 0x13, 0xdd, 0xbb, 1109b958cff6SChuck Lever 0x57, 0xa4, 0x14, 0x6c, 0x15, 0x87, 0xcb, 0xa4, 1110b958cff6SChuck Lever 0x35, 0x66, 0x65, 0x59, 0x1d, 0x22, 0x40, 0x28, 1111b958cff6SChuck Lever 0x2f, 0x58, 0x42, 0xb1, 0x05, 0xa5 1112b958cff6SChuck Lever ); 1113b958cff6SChuck Lever 1114b958cff6SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test6_confounder, 1115b958cff6SChuck Lever 0x3c, 0xbb, 0xd2, 0xb4, 0x59, 0x17, 0x94, 0x10, 1116b958cff6SChuck Lever 0x67, 0xf9, 0x65, 0x99, 0xbb, 0x98, 0x92, 0x6c 1117b958cff6SChuck Lever ); 1118b958cff6SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test6_basekey, 1119b958cff6SChuck Lever 0xb6, 0x1c, 0x86, 0xcc, 0x4e, 0x5d, 0x27, 0x57, 1120b958cff6SChuck Lever 0x54, 0x5a, 0xd4, 0x23, 0x39, 0x9f, 0xb7, 0x03, 1121b958cff6SChuck Lever 0x1e, 0xca, 0xb9, 0x13, 0xcb, 0xb9, 0x00, 0xbd, 1122b958cff6SChuck Lever 0x7a, 0x3c, 0x6d, 0xd8, 0xbf, 0x92, 0x01, 0x5b 1123b958cff6SChuck Lever ); 1124b958cff6SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test6_expected_result, 1125b958cff6SChuck Lever 0x03, 0x88, 0x6d, 0x03, 0x31, 0x0b, 0x47, 0xa6, 1126b958cff6SChuck Lever 0xd8, 0xf0, 0x6d, 0x7b, 0x94, 0xd1, 0xdd, 0x83, 1127b958cff6SChuck Lever 0x7e, 0xcc, 0xe3, 0x15, 0xef, 0x65, 0x2a, 0xff, 1128b958cff6SChuck Lever 0x62, 0x08, 0x59, 0xd9, 0x4a, 0x25, 0x92, 0x66 1129b958cff6SChuck Lever ); 1130b958cff6SChuck Lever 1131b958cff6SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test7_confounder, 1132b958cff6SChuck Lever 0xde, 0xf4, 0x87, 0xfc, 0xeb, 0xe6, 0xde, 0x63, 1133b958cff6SChuck Lever 0x46, 0xd4, 0xda, 0x45, 0x21, 0xbb, 0xa2, 0xd2 1134b958cff6SChuck Lever ); 1135b958cff6SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test7_basekey, 1136b958cff6SChuck Lever 0x1b, 0x97, 0xfe, 0x0a, 0x19, 0x0e, 0x20, 0x21, 1137b958cff6SChuck Lever 0xeb, 0x30, 0x75, 0x3e, 0x1b, 0x6e, 0x1e, 0x77, 1138b958cff6SChuck Lever 0xb0, 0x75, 0x4b, 0x1d, 0x68, 0x46, 0x10, 0x35, 1139b958cff6SChuck Lever 0x58, 0x64, 0x10, 0x49, 0x63, 0x46, 0x38, 0x33 1140b958cff6SChuck Lever ); 1141b958cff6SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test7_expected_result, 1142b958cff6SChuck Lever 0x2c, 0x9c, 0x15, 0x70, 0x13, 0x3c, 0x99, 0xbf, 1143b958cff6SChuck Lever 0x6a, 0x34, 0xbc, 0x1b, 0x02, 0x12, 0x00, 0x2f, 1144b958cff6SChuck Lever 0xd1, 0x94, 0x33, 0x87, 0x49, 0xdb, 0x41, 0x35, 1145b958cff6SChuck Lever 0x49, 0x7a, 0x34, 0x7c, 0xfc, 0xd9, 0xd1, 0x8a, 1146b958cff6SChuck Lever 0x12 1147b958cff6SChuck Lever ); 1148b958cff6SChuck Lever 1149b958cff6SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test8_confounder, 1150b958cff6SChuck Lever 0xad, 0x4f, 0xf9, 0x04, 0xd3, 0x4e, 0x55, 0x53, 1151b958cff6SChuck Lever 0x84, 0xb1, 0x41, 0x00, 0xfc, 0x46, 0x5f, 0x88 1152b958cff6SChuck Lever ); 1153b958cff6SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test8_basekey, 1154b958cff6SChuck Lever 0x32, 0x16, 0x4c, 0x5b, 0x43, 0x4d, 0x1d, 0x15, 1155b958cff6SChuck Lever 0x38, 0xe4, 0xcf, 0xd9, 0xbe, 0x80, 0x40, 0xfe, 1156b958cff6SChuck Lever 0x8c, 0x4a, 0xc7, 0xac, 0xc4, 0xb9, 0x3d, 0x33, 1157b958cff6SChuck Lever 0x14, 0xd2, 0x13, 0x36, 0x68, 0x14, 0x7a, 0x05 1158b958cff6SChuck Lever ); 1159b958cff6SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test8_expected_result, 1160b958cff6SChuck Lever 0x9c, 0x6d, 0xe7, 0x5f, 0x81, 0x2d, 0xe7, 0xed, 1161b958cff6SChuck Lever 0x0d, 0x28, 0xb2, 0x96, 0x35, 0x57, 0xa1, 0x15, 1162b958cff6SChuck Lever 0x64, 0x09, 0x98, 0x27, 0x5b, 0x0a, 0xf5, 0x15, 1163b958cff6SChuck Lever 0x27, 0x09, 0x91, 0x3f, 0xf5, 0x2a, 0x2a, 0x9c, 1164b958cff6SChuck Lever 0x8e, 0x63, 0xb8, 0x72, 0xf9, 0x2e, 0x64, 0xc8, 1165b958cff6SChuck Lever 0x39 1166b958cff6SChuck Lever ); 1167b958cff6SChuck Lever 1168b958cff6SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test9_confounder, 1169b958cff6SChuck Lever 0xcf, 0x9b, 0xca, 0x6d, 0xf1, 0x14, 0x4e, 0x0c, 1170b958cff6SChuck Lever 0x0a, 0xf9, 0xb8, 0xf3, 0x4c, 0x90, 0xd5, 0x14 1171b958cff6SChuck Lever ); 1172b958cff6SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test9_basekey, 1173b958cff6SChuck Lever 0xb0, 0x38, 0xb1, 0x32, 0xcd, 0x8e, 0x06, 0x61, 1174b958cff6SChuck Lever 0x22, 0x67, 0xfa, 0xb7, 0x17, 0x00, 0x66, 0xd8, 1175b958cff6SChuck Lever 0x8a, 0xec, 0xcb, 0xa0, 0xb7, 0x44, 0xbf, 0xc6, 1176b958cff6SChuck Lever 0x0d, 0xc8, 0x9b, 0xca, 0x18, 0x2d, 0x07, 0x15 1177b958cff6SChuck Lever ); 1178b958cff6SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test9_expected_result, 1179b958cff6SChuck Lever 0xee, 0xec, 0x85, 0xa9, 0x81, 0x3c, 0xdc, 0x53, 1180b958cff6SChuck Lever 0x67, 0x72, 0xab, 0x9b, 0x42, 0xde, 0xfc, 0x57, 1181b958cff6SChuck Lever 0x06, 0xf7, 0x26, 0xe9, 0x75, 0xdd, 0xe0, 0x5a, 1182b958cff6SChuck Lever 0x87, 0xeb, 0x54, 0x06, 0xea, 0x32, 0x4c, 0xa1, 1183b958cff6SChuck Lever 0x85, 0xc9, 0x98, 0x6b, 0x42, 0xaa, 0xbe, 0x79, 1184b958cff6SChuck Lever 0x4b, 0x84, 0x82, 0x1b, 0xee 1185b958cff6SChuck Lever ); 1186b958cff6SChuck Lever 1187b958cff6SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test10_confounder, 1188b958cff6SChuck Lever 0x64, 0x4d, 0xef, 0x38, 0xda, 0x35, 0x00, 0x72, 1189b958cff6SChuck Lever 0x75, 0x87, 0x8d, 0x21, 0x68, 0x55, 0xe2, 0x28 1190b958cff6SChuck Lever ); 1191b958cff6SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test10_basekey, 1192b958cff6SChuck Lever 0xcc, 0xfc, 0xd3, 0x49, 0xbf, 0x4c, 0x66, 0x77, 1193b958cff6SChuck Lever 0xe8, 0x6e, 0x4b, 0x02, 0xb8, 0xea, 0xb9, 0x24, 1194b958cff6SChuck Lever 0xa5, 0x46, 0xac, 0x73, 0x1c, 0xf9, 0xbf, 0x69, 1195b958cff6SChuck Lever 0x89, 0xb9, 0x96, 0xe7, 0xd6, 0xbf, 0xbb, 0xa7 1196b958cff6SChuck Lever ); 1197b958cff6SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test10_expected_result, 1198b958cff6SChuck Lever 0x0e, 0x44, 0x68, 0x09, 0x85, 0x85, 0x5f, 0x2d, 1199b958cff6SChuck Lever 0x1f, 0x18, 0x12, 0x52, 0x9c, 0xa8, 0x3b, 0xfd, 1200b958cff6SChuck Lever 0x8e, 0x34, 0x9d, 0xe6, 0xfd, 0x9a, 0xda, 0x0b, 1201b958cff6SChuck Lever 0xaa, 0xa0, 0x48, 0xd6, 0x8e, 0x26, 0x5f, 0xeb, 1202b958cff6SChuck Lever 0xf3, 0x4a, 0xd1, 0x25, 0x5a, 0x34, 0x49, 0x99, 1203b958cff6SChuck Lever 0xad, 0x37, 0x14, 0x68, 0x87, 0xa6, 0xc6, 0x84, 1204b958cff6SChuck Lever 0x57, 0x31, 0xac, 0x7f, 0x46, 0x37, 0x6a, 0x05, 1205b958cff6SChuck Lever 0x04, 0xcd, 0x06, 0x57, 0x14, 0x74 1206b958cff6SChuck Lever ); 1207b958cff6SChuck Lever 1208b958cff6SChuck Lever static const struct gss_krb5_test_param rfc6803_encrypt_test_params[] = { 1209b958cff6SChuck Lever { 1210b958cff6SChuck Lever .desc = "Encrypt empty plaintext with camellia128-cts-cmac", 1211b958cff6SChuck Lever .enctype = ENCTYPE_CAMELLIA128_CTS_CMAC, 1212b958cff6SChuck Lever .constant = 0, 1213b958cff6SChuck Lever .base_key = &rfc6803_enc_test1_basekey, 1214b958cff6SChuck Lever .plaintext = &rfc6803_enc_empty_plaintext, 1215b958cff6SChuck Lever .confounder = &rfc6803_enc_test1_confounder, 1216b958cff6SChuck Lever .expected_result = &rfc6803_enc_test1_expected_result, 1217b958cff6SChuck Lever }, 1218b958cff6SChuck Lever { 1219b958cff6SChuck Lever .desc = "Encrypt 1 byte with camellia128-cts-cmac", 1220b958cff6SChuck Lever .enctype = ENCTYPE_CAMELLIA128_CTS_CMAC, 1221b958cff6SChuck Lever .constant = 1, 1222b958cff6SChuck Lever .base_key = &rfc6803_enc_test2_basekey, 1223b958cff6SChuck Lever .plaintext = &rfc6803_enc_1byte_plaintext, 1224b958cff6SChuck Lever .confounder = &rfc6803_enc_test2_confounder, 1225b958cff6SChuck Lever .expected_result = &rfc6803_enc_test2_expected_result, 1226b958cff6SChuck Lever }, 1227b958cff6SChuck Lever { 1228b958cff6SChuck Lever .desc = "Encrypt 9 bytes with camellia128-cts-cmac", 1229b958cff6SChuck Lever .enctype = ENCTYPE_CAMELLIA128_CTS_CMAC, 1230b958cff6SChuck Lever .constant = 2, 1231b958cff6SChuck Lever .base_key = &rfc6803_enc_test3_basekey, 1232b958cff6SChuck Lever .plaintext = &rfc6803_enc_9byte_plaintext, 1233b958cff6SChuck Lever .confounder = &rfc6803_enc_test3_confounder, 1234b958cff6SChuck Lever .expected_result = &rfc6803_enc_test3_expected_result, 1235b958cff6SChuck Lever }, 1236b958cff6SChuck Lever { 1237b958cff6SChuck Lever .desc = "Encrypt 13 bytes with camellia128-cts-cmac", 1238b958cff6SChuck Lever .enctype = ENCTYPE_CAMELLIA128_CTS_CMAC, 1239b958cff6SChuck Lever .constant = 3, 1240b958cff6SChuck Lever .base_key = &rfc6803_enc_test4_basekey, 1241b958cff6SChuck Lever .plaintext = &rfc6803_enc_13byte_plaintext, 1242b958cff6SChuck Lever .confounder = &rfc6803_enc_test4_confounder, 1243b958cff6SChuck Lever .expected_result = &rfc6803_enc_test4_expected_result, 1244b958cff6SChuck Lever }, 1245b958cff6SChuck Lever { 1246b958cff6SChuck Lever .desc = "Encrypt 30 bytes with camellia128-cts-cmac", 1247b958cff6SChuck Lever .enctype = ENCTYPE_CAMELLIA128_CTS_CMAC, 1248b958cff6SChuck Lever .constant = 4, 1249b958cff6SChuck Lever .base_key = &rfc6803_enc_test5_basekey, 1250b958cff6SChuck Lever .plaintext = &rfc6803_enc_30byte_plaintext, 1251b958cff6SChuck Lever .confounder = &rfc6803_enc_test5_confounder, 1252b958cff6SChuck Lever .expected_result = &rfc6803_enc_test5_expected_result, 1253b958cff6SChuck Lever }, 1254b958cff6SChuck Lever { 1255b958cff6SChuck Lever .desc = "Encrypt empty plaintext with camellia256-cts-cmac", 1256b958cff6SChuck Lever .enctype = ENCTYPE_CAMELLIA256_CTS_CMAC, 1257b958cff6SChuck Lever .constant = 0, 1258b958cff6SChuck Lever .base_key = &rfc6803_enc_test6_basekey, 1259b958cff6SChuck Lever .plaintext = &rfc6803_enc_empty_plaintext, 1260b958cff6SChuck Lever .confounder = &rfc6803_enc_test6_confounder, 1261b958cff6SChuck Lever .expected_result = &rfc6803_enc_test6_expected_result, 1262b958cff6SChuck Lever }, 1263b958cff6SChuck Lever { 1264b958cff6SChuck Lever .desc = "Encrypt 1 byte with camellia256-cts-cmac", 1265b958cff6SChuck Lever .enctype = ENCTYPE_CAMELLIA256_CTS_CMAC, 1266b958cff6SChuck Lever .constant = 1, 1267b958cff6SChuck Lever .base_key = &rfc6803_enc_test7_basekey, 1268b958cff6SChuck Lever .plaintext = &rfc6803_enc_1byte_plaintext, 1269b958cff6SChuck Lever .confounder = &rfc6803_enc_test7_confounder, 1270b958cff6SChuck Lever .expected_result = &rfc6803_enc_test7_expected_result, 1271b958cff6SChuck Lever }, 1272b958cff6SChuck Lever { 1273b958cff6SChuck Lever .desc = "Encrypt 9 bytes with camellia256-cts-cmac", 1274b958cff6SChuck Lever .enctype = ENCTYPE_CAMELLIA256_CTS_CMAC, 1275b958cff6SChuck Lever .constant = 2, 1276b958cff6SChuck Lever .base_key = &rfc6803_enc_test8_basekey, 1277b958cff6SChuck Lever .plaintext = &rfc6803_enc_9byte_plaintext, 1278b958cff6SChuck Lever .confounder = &rfc6803_enc_test8_confounder, 1279b958cff6SChuck Lever .expected_result = &rfc6803_enc_test8_expected_result, 1280b958cff6SChuck Lever }, 1281b958cff6SChuck Lever { 1282b958cff6SChuck Lever .desc = "Encrypt 13 bytes with camellia256-cts-cmac", 1283b958cff6SChuck Lever .enctype = ENCTYPE_CAMELLIA256_CTS_CMAC, 1284b958cff6SChuck Lever .constant = 3, 1285b958cff6SChuck Lever .base_key = &rfc6803_enc_test9_basekey, 1286b958cff6SChuck Lever .plaintext = &rfc6803_enc_13byte_plaintext, 1287b958cff6SChuck Lever .confounder = &rfc6803_enc_test9_confounder, 1288b958cff6SChuck Lever .expected_result = &rfc6803_enc_test9_expected_result, 1289b958cff6SChuck Lever }, 1290b958cff6SChuck Lever { 1291b958cff6SChuck Lever .desc = "Encrypt 30 bytes with camellia256-cts-cmac", 1292b958cff6SChuck Lever .enctype = ENCTYPE_CAMELLIA256_CTS_CMAC, 1293b958cff6SChuck Lever .constant = 4, 1294b958cff6SChuck Lever .base_key = &rfc6803_enc_test10_basekey, 1295b958cff6SChuck Lever .plaintext = &rfc6803_enc_30byte_plaintext, 1296b958cff6SChuck Lever .confounder = &rfc6803_enc_test10_confounder, 1297b958cff6SChuck Lever .expected_result = &rfc6803_enc_test10_expected_result, 1298b958cff6SChuck Lever }, 1299b958cff6SChuck Lever }; 1300b958cff6SChuck Lever 1301b958cff6SChuck Lever /* Creates the function rfc6803_encrypt_gen_params */ 1302b958cff6SChuck Lever KUNIT_ARRAY_PARAM(rfc6803_encrypt, rfc6803_encrypt_test_params, 1303b958cff6SChuck Lever gss_krb5_get_desc); 1304b958cff6SChuck Lever 1305b958cff6SChuck Lever static void rfc6803_encrypt_case(struct kunit *test) 1306b958cff6SChuck Lever { 1307b958cff6SChuck Lever const struct gss_krb5_test_param *param = test->param_value; 1308b958cff6SChuck Lever struct crypto_sync_skcipher *cts_tfm, *cbc_tfm; 1309b958cff6SChuck Lever const struct gss_krb5_enctype *gk5e; 1310b958cff6SChuck Lever struct xdr_netobj Ke, Ki, checksum; 1311b958cff6SChuck Lever u8 usage_data[GSS_KRB5_K5CLENGTH]; 1312b958cff6SChuck Lever struct xdr_netobj usage = { 1313b958cff6SChuck Lever .data = usage_data, 1314b958cff6SChuck Lever .len = sizeof(usage_data), 1315b958cff6SChuck Lever }; 1316b958cff6SChuck Lever struct crypto_ahash *ahash_tfm; 1317b958cff6SChuck Lever unsigned int blocksize; 1318b958cff6SChuck Lever struct xdr_buf buf; 1319b958cff6SChuck Lever void *text; 1320b958cff6SChuck Lever size_t len; 1321b958cff6SChuck Lever u32 err; 1322b958cff6SChuck Lever 1323b958cff6SChuck Lever /* Arrange */ 1324b958cff6SChuck Lever gk5e = gss_krb5_lookup_enctype(param->enctype); 1325*fe90151cSChuck Lever if (!gk5e) 1326*fe90151cSChuck Lever kunit_skip(test, "Encryption type is not available"); 1327b958cff6SChuck Lever 1328b958cff6SChuck Lever usage.data[3] = param->constant; 1329b958cff6SChuck Lever 1330b958cff6SChuck Lever Ke.len = gk5e->Ke_length; 1331b958cff6SChuck Lever Ke.data = kunit_kzalloc(test, Ke.len, GFP_KERNEL); 1332b958cff6SChuck Lever KUNIT_ASSERT_NOT_ERR_OR_NULL(test, Ke.data); 1333b958cff6SChuck Lever usage.data[4] = KEY_USAGE_SEED_ENCRYPTION; 1334b958cff6SChuck Lever err = gk5e->derive_key(gk5e, param->base_key, &Ke, &usage, GFP_KERNEL); 1335b958cff6SChuck Lever KUNIT_ASSERT_EQ(test, err, 0); 1336b958cff6SChuck Lever 1337b958cff6SChuck Lever cbc_tfm = crypto_alloc_sync_skcipher(gk5e->aux_cipher, 0, 0); 1338b958cff6SChuck Lever KUNIT_ASSERT_NOT_ERR_OR_NULL(test, cbc_tfm); 1339b958cff6SChuck Lever err = crypto_sync_skcipher_setkey(cbc_tfm, Ke.data, Ke.len); 1340b958cff6SChuck Lever KUNIT_ASSERT_EQ(test, err, 0); 1341b958cff6SChuck Lever 1342b958cff6SChuck Lever cts_tfm = crypto_alloc_sync_skcipher(gk5e->encrypt_name, 0, 0); 1343b958cff6SChuck Lever KUNIT_ASSERT_NOT_ERR_OR_NULL(test, cts_tfm); 1344b958cff6SChuck Lever err = crypto_sync_skcipher_setkey(cts_tfm, Ke.data, Ke.len); 1345b958cff6SChuck Lever KUNIT_ASSERT_EQ(test, err, 0); 1346b958cff6SChuck Lever blocksize = crypto_sync_skcipher_blocksize(cts_tfm); 1347b958cff6SChuck Lever 1348b958cff6SChuck Lever len = param->confounder->len + param->plaintext->len + blocksize; 1349b958cff6SChuck Lever text = kunit_kzalloc(test, len, GFP_KERNEL); 1350b958cff6SChuck Lever KUNIT_ASSERT_NOT_ERR_OR_NULL(test, text); 1351b958cff6SChuck Lever memcpy(text, param->confounder->data, param->confounder->len); 1352b958cff6SChuck Lever memcpy(text + param->confounder->len, param->plaintext->data, 1353b958cff6SChuck Lever param->plaintext->len); 1354b958cff6SChuck Lever 1355b958cff6SChuck Lever memset(&buf, 0, sizeof(buf)); 1356b958cff6SChuck Lever buf.head[0].iov_base = text; 1357b958cff6SChuck Lever buf.head[0].iov_len = param->confounder->len + param->plaintext->len; 1358b958cff6SChuck Lever buf.len = buf.head[0].iov_len; 1359b958cff6SChuck Lever 1360b958cff6SChuck Lever checksum.len = gk5e->cksumlength; 1361b958cff6SChuck Lever checksum.data = kunit_kzalloc(test, checksum.len, GFP_KERNEL); 1362b958cff6SChuck Lever KUNIT_ASSERT_NOT_ERR_OR_NULL(test, checksum.data); 1363b958cff6SChuck Lever 1364b958cff6SChuck Lever Ki.len = gk5e->Ki_length; 1365b958cff6SChuck Lever Ki.data = kunit_kzalloc(test, Ki.len, GFP_KERNEL); 1366b958cff6SChuck Lever KUNIT_ASSERT_NOT_ERR_OR_NULL(test, Ki.data); 1367b958cff6SChuck Lever usage.data[4] = KEY_USAGE_SEED_INTEGRITY; 1368b958cff6SChuck Lever err = gk5e->derive_key(gk5e, param->base_key, &Ki, 1369b958cff6SChuck Lever &usage, GFP_KERNEL); 1370b958cff6SChuck Lever KUNIT_ASSERT_EQ(test, err, 0); 1371b958cff6SChuck Lever ahash_tfm = crypto_alloc_ahash(gk5e->cksum_name, 0, CRYPTO_ALG_ASYNC); 1372b958cff6SChuck Lever KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ahash_tfm); 1373b958cff6SChuck Lever err = crypto_ahash_setkey(ahash_tfm, Ki.data, Ki.len); 1374b958cff6SChuck Lever KUNIT_ASSERT_EQ(test, err, 0); 1375b958cff6SChuck Lever 1376b958cff6SChuck Lever /* Act */ 1377b958cff6SChuck Lever err = gss_krb5_checksum(ahash_tfm, NULL, 0, &buf, 0, &checksum); 1378b958cff6SChuck Lever KUNIT_ASSERT_EQ(test, err, 0); 1379b958cff6SChuck Lever 1380b958cff6SChuck Lever err = krb5_cbc_cts_encrypt(cts_tfm, cbc_tfm, 0, &buf, NULL, NULL, 0); 1381b958cff6SChuck Lever KUNIT_ASSERT_EQ(test, err, 0); 1382b958cff6SChuck Lever 1383b958cff6SChuck Lever /* Assert */ 1384b958cff6SChuck Lever KUNIT_EXPECT_EQ_MSG(test, param->expected_result->len, 1385b958cff6SChuck Lever buf.len + checksum.len, 1386b958cff6SChuck Lever "ciphertext length mismatch"); 1387b958cff6SChuck Lever KUNIT_EXPECT_EQ_MSG(test, 1388b958cff6SChuck Lever memcmp(param->expected_result->data, 1389b958cff6SChuck Lever buf.head[0].iov_base, buf.len), 0, 1390b958cff6SChuck Lever "encrypted result mismatch"); 1391b958cff6SChuck Lever KUNIT_EXPECT_EQ_MSG(test, 1392b958cff6SChuck Lever memcmp(param->expected_result->data + 1393b958cff6SChuck Lever (param->expected_result->len - checksum.len), 1394b958cff6SChuck Lever checksum.data, checksum.len), 0, 1395b958cff6SChuck Lever "HMAC mismatch"); 1396b958cff6SChuck Lever 1397b958cff6SChuck Lever crypto_free_ahash(ahash_tfm); 1398b958cff6SChuck Lever crypto_free_sync_skcipher(cts_tfm); 1399b958cff6SChuck Lever crypto_free_sync_skcipher(cbc_tfm); 1400b958cff6SChuck Lever } 1401b958cff6SChuck Lever 140235f6e42eSChuck Lever static struct kunit_case rfc6803_test_cases[] = { 140335f6e42eSChuck Lever { 140435f6e42eSChuck Lever .name = "RFC 6803 key derivation", 140535f6e42eSChuck Lever .run_case = kdf_case, 140635f6e42eSChuck Lever .generate_params = rfc6803_kdf_gen_params, 140735f6e42eSChuck Lever }, 140802142b2cSChuck Lever { 140902142b2cSChuck Lever .name = "RFC 6803 checksum", 141002142b2cSChuck Lever .run_case = checksum_case, 141102142b2cSChuck Lever .generate_params = rfc6803_checksum_gen_params, 141202142b2cSChuck Lever }, 1413b958cff6SChuck Lever { 1414b958cff6SChuck Lever .name = "RFC 6803 encryption", 1415b958cff6SChuck Lever .run_case = rfc6803_encrypt_case, 1416b958cff6SChuck Lever .generate_params = rfc6803_encrypt_gen_params, 1417b958cff6SChuck Lever }, 141835f6e42eSChuck Lever }; 141935f6e42eSChuck Lever 142035f6e42eSChuck Lever static struct kunit_suite rfc6803_suite = { 142135f6e42eSChuck Lever .name = "RFC 6803 suite", 142235f6e42eSChuck Lever .test_cases = rfc6803_test_cases, 142335f6e42eSChuck Lever }; 142435f6e42eSChuck Lever 1425fcbad14bSChuck Lever /* 1426fcbad14bSChuck Lever * From RFC 8009 Appendix A. Test Vectors 1427fcbad14bSChuck Lever * 1428fcbad14bSChuck Lever * Sample results for SHA-2 enctype key derivation 1429fcbad14bSChuck Lever * 1430fcbad14bSChuck Lever * This test material is copyright (c) 2016 IETF Trust and the 1431fcbad14bSChuck Lever * persons identified as the document authors. All rights reserved. 1432fcbad14bSChuck Lever */ 1433fcbad14bSChuck Lever 1434fcbad14bSChuck Lever DEFINE_HEX_XDR_NETOBJ(aes128_cts_hmac_sha256_128_basekey, 1435fcbad14bSChuck Lever 0x37, 0x05, 0xd9, 0x60, 0x80, 0xc1, 0x77, 0x28, 1436fcbad14bSChuck Lever 0xa0, 0xe8, 0x00, 0xea, 0xb6, 0xe0, 0xd2, 0x3c 1437fcbad14bSChuck Lever ); 1438fcbad14bSChuck Lever DEFINE_HEX_XDR_NETOBJ(aes128_cts_hmac_sha256_128_Kc, 1439fcbad14bSChuck Lever 0xb3, 0x1a, 0x01, 0x8a, 0x48, 0xf5, 0x47, 0x76, 1440fcbad14bSChuck Lever 0xf4, 0x03, 0xe9, 0xa3, 0x96, 0x32, 0x5d, 0xc3 1441fcbad14bSChuck Lever ); 1442fcbad14bSChuck Lever DEFINE_HEX_XDR_NETOBJ(aes128_cts_hmac_sha256_128_Ke, 1443fcbad14bSChuck Lever 0x9b, 0x19, 0x7d, 0xd1, 0xe8, 0xc5, 0x60, 0x9d, 1444fcbad14bSChuck Lever 0x6e, 0x67, 0xc3, 0xe3, 0x7c, 0x62, 0xc7, 0x2e 1445fcbad14bSChuck Lever ); 1446fcbad14bSChuck Lever DEFINE_HEX_XDR_NETOBJ(aes128_cts_hmac_sha256_128_Ki, 1447fcbad14bSChuck Lever 0x9f, 0xda, 0x0e, 0x56, 0xab, 0x2d, 0x85, 0xe1, 1448fcbad14bSChuck Lever 0x56, 0x9a, 0x68, 0x86, 0x96, 0xc2, 0x6a, 0x6c 1449fcbad14bSChuck Lever ); 1450fcbad14bSChuck Lever 1451fcbad14bSChuck Lever DEFINE_HEX_XDR_NETOBJ(aes256_cts_hmac_sha384_192_basekey, 1452fcbad14bSChuck Lever 0x6d, 0x40, 0x4d, 0x37, 0xfa, 0xf7, 0x9f, 0x9d, 1453fcbad14bSChuck Lever 0xf0, 0xd3, 0x35, 0x68, 0xd3, 0x20, 0x66, 0x98, 1454fcbad14bSChuck Lever 0x00, 0xeb, 0x48, 0x36, 0x47, 0x2e, 0xa8, 0xa0, 1455fcbad14bSChuck Lever 0x26, 0xd1, 0x6b, 0x71, 0x82, 0x46, 0x0c, 0x52 1456fcbad14bSChuck Lever ); 1457fcbad14bSChuck Lever DEFINE_HEX_XDR_NETOBJ(aes256_cts_hmac_sha384_192_Kc, 1458fcbad14bSChuck Lever 0xef, 0x57, 0x18, 0xbe, 0x86, 0xcc, 0x84, 0x96, 1459fcbad14bSChuck Lever 0x3d, 0x8b, 0xbb, 0x50, 0x31, 0xe9, 0xf5, 0xc4, 1460fcbad14bSChuck Lever 0xba, 0x41, 0xf2, 0x8f, 0xaf, 0x69, 0xe7, 0x3d 1461fcbad14bSChuck Lever ); 1462fcbad14bSChuck Lever DEFINE_HEX_XDR_NETOBJ(aes256_cts_hmac_sha384_192_Ke, 1463fcbad14bSChuck Lever 0x56, 0xab, 0x22, 0xbe, 0xe6, 0x3d, 0x82, 0xd7, 1464fcbad14bSChuck Lever 0xbc, 0x52, 0x27, 0xf6, 0x77, 0x3f, 0x8e, 0xa7, 1465fcbad14bSChuck Lever 0xa5, 0xeb, 0x1c, 0x82, 0x51, 0x60, 0xc3, 0x83, 1466fcbad14bSChuck Lever 0x12, 0x98, 0x0c, 0x44, 0x2e, 0x5c, 0x7e, 0x49 1467fcbad14bSChuck Lever ); 1468fcbad14bSChuck Lever DEFINE_HEX_XDR_NETOBJ(aes256_cts_hmac_sha384_192_Ki, 1469fcbad14bSChuck Lever 0x69, 0xb1, 0x65, 0x14, 0xe3, 0xcd, 0x8e, 0x56, 1470fcbad14bSChuck Lever 0xb8, 0x20, 0x10, 0xd5, 0xc7, 0x30, 0x12, 0xb6, 1471fcbad14bSChuck Lever 0x22, 0xc4, 0xd0, 0x0f, 0xfc, 0x23, 0xed, 0x1f 1472fcbad14bSChuck Lever ); 1473fcbad14bSChuck Lever 1474fcbad14bSChuck Lever static const struct gss_krb5_test_param rfc8009_kdf_test_params[] = { 1475fcbad14bSChuck Lever { 1476fcbad14bSChuck Lever .desc = "Derive Kc subkey for aes128-cts-hmac-sha256-128", 1477fcbad14bSChuck Lever .enctype = ENCTYPE_AES128_CTS_HMAC_SHA256_128, 1478fcbad14bSChuck Lever .base_key = &aes128_cts_hmac_sha256_128_basekey, 1479fcbad14bSChuck Lever .usage = &usage_checksum, 1480fcbad14bSChuck Lever .expected_result = &aes128_cts_hmac_sha256_128_Kc, 1481fcbad14bSChuck Lever }, 1482fcbad14bSChuck Lever { 1483fcbad14bSChuck Lever .desc = "Derive Ke subkey for aes128-cts-hmac-sha256-128", 1484fcbad14bSChuck Lever .enctype = ENCTYPE_AES128_CTS_HMAC_SHA256_128, 1485fcbad14bSChuck Lever .base_key = &aes128_cts_hmac_sha256_128_basekey, 1486fcbad14bSChuck Lever .usage = &usage_encryption, 1487fcbad14bSChuck Lever .expected_result = &aes128_cts_hmac_sha256_128_Ke, 1488fcbad14bSChuck Lever }, 1489fcbad14bSChuck Lever { 1490fcbad14bSChuck Lever .desc = "Derive Ki subkey for aes128-cts-hmac-sha256-128", 1491fcbad14bSChuck Lever .enctype = ENCTYPE_AES128_CTS_HMAC_SHA256_128, 1492fcbad14bSChuck Lever .base_key = &aes128_cts_hmac_sha256_128_basekey, 1493fcbad14bSChuck Lever .usage = &usage_integrity, 1494fcbad14bSChuck Lever .expected_result = &aes128_cts_hmac_sha256_128_Ki, 1495fcbad14bSChuck Lever }, 1496fcbad14bSChuck Lever { 1497fcbad14bSChuck Lever .desc = "Derive Kc subkey for aes256-cts-hmac-sha384-192", 1498fcbad14bSChuck Lever .enctype = ENCTYPE_AES256_CTS_HMAC_SHA384_192, 1499fcbad14bSChuck Lever .base_key = &aes256_cts_hmac_sha384_192_basekey, 1500fcbad14bSChuck Lever .usage = &usage_checksum, 1501fcbad14bSChuck Lever .expected_result = &aes256_cts_hmac_sha384_192_Kc, 1502fcbad14bSChuck Lever }, 1503fcbad14bSChuck Lever { 1504fcbad14bSChuck Lever .desc = "Derive Ke subkey for aes256-cts-hmac-sha384-192", 1505fcbad14bSChuck Lever .enctype = ENCTYPE_AES256_CTS_HMAC_SHA384_192, 1506fcbad14bSChuck Lever .base_key = &aes256_cts_hmac_sha384_192_basekey, 1507fcbad14bSChuck Lever .usage = &usage_encryption, 1508fcbad14bSChuck Lever .expected_result = &aes256_cts_hmac_sha384_192_Ke, 1509fcbad14bSChuck Lever }, 1510fcbad14bSChuck Lever { 1511fcbad14bSChuck Lever .desc = "Derive Ki subkey for aes256-cts-hmac-sha384-192", 1512fcbad14bSChuck Lever .enctype = ENCTYPE_AES256_CTS_HMAC_SHA384_192, 1513fcbad14bSChuck Lever .base_key = &aes256_cts_hmac_sha384_192_basekey, 1514fcbad14bSChuck Lever .usage = &usage_integrity, 1515fcbad14bSChuck Lever .expected_result = &aes256_cts_hmac_sha384_192_Ki, 1516fcbad14bSChuck Lever }, 1517fcbad14bSChuck Lever }; 1518fcbad14bSChuck Lever 1519fcbad14bSChuck Lever /* Creates the function rfc8009_kdf_gen_params */ 1520fcbad14bSChuck Lever KUNIT_ARRAY_PARAM(rfc8009_kdf, rfc8009_kdf_test_params, gss_krb5_get_desc); 1521fcbad14bSChuck Lever 1522003caf4fSChuck Lever /* 1523003caf4fSChuck Lever * From RFC 8009 Appendix A. Test Vectors 1524003caf4fSChuck Lever * 1525003caf4fSChuck Lever * These sample checksums use the above sample key derivation results, 1526003caf4fSChuck Lever * including use of the same base-key and key usage values. 1527003caf4fSChuck Lever * 1528003caf4fSChuck Lever * This test material is copyright (c) 2016 IETF Trust and the 1529003caf4fSChuck Lever * persons identified as the document authors. All rights reserved. 1530003caf4fSChuck Lever */ 1531003caf4fSChuck Lever 1532003caf4fSChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc8009_checksum_plaintext, 1533003caf4fSChuck Lever 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 1534003caf4fSChuck Lever 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 1535003caf4fSChuck Lever 0x10, 0x11, 0x12, 0x13, 0x14 1536003caf4fSChuck Lever ); 1537003caf4fSChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc8009_checksum_test1_expected_result, 1538003caf4fSChuck Lever 0xd7, 0x83, 0x67, 0x18, 0x66, 0x43, 0xd6, 0x7b, 1539003caf4fSChuck Lever 0x41, 0x1c, 0xba, 0x91, 0x39, 0xfc, 0x1d, 0xee 1540003caf4fSChuck Lever ); 1541003caf4fSChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc8009_checksum_test2_expected_result, 1542003caf4fSChuck Lever 0x45, 0xee, 0x79, 0x15, 0x67, 0xee, 0xfc, 0xa3, 1543003caf4fSChuck Lever 0x7f, 0x4a, 0xc1, 0xe0, 0x22, 0x2d, 0xe8, 0x0d, 1544003caf4fSChuck Lever 0x43, 0xc3, 0xbf, 0xa0, 0x66, 0x99, 0x67, 0x2a 1545003caf4fSChuck Lever ); 1546003caf4fSChuck Lever 1547003caf4fSChuck Lever static const struct gss_krb5_test_param rfc8009_checksum_test_params[] = { 1548003caf4fSChuck Lever { 1549003caf4fSChuck Lever .desc = "Checksum with aes128-cts-hmac-sha256-128", 1550003caf4fSChuck Lever .enctype = ENCTYPE_AES128_CTS_HMAC_SHA256_128, 1551003caf4fSChuck Lever .base_key = &aes128_cts_hmac_sha256_128_basekey, 1552003caf4fSChuck Lever .usage = &usage_checksum, 1553003caf4fSChuck Lever .plaintext = &rfc8009_checksum_plaintext, 1554003caf4fSChuck Lever .expected_result = &rfc8009_checksum_test1_expected_result, 1555003caf4fSChuck Lever }, 1556003caf4fSChuck Lever { 1557003caf4fSChuck Lever .desc = "Checksum with aes256-cts-hmac-sha384-192", 1558003caf4fSChuck Lever .enctype = ENCTYPE_AES256_CTS_HMAC_SHA384_192, 1559003caf4fSChuck Lever .base_key = &aes256_cts_hmac_sha384_192_basekey, 1560003caf4fSChuck Lever .usage = &usage_checksum, 1561003caf4fSChuck Lever .plaintext = &rfc8009_checksum_plaintext, 1562003caf4fSChuck Lever .expected_result = &rfc8009_checksum_test2_expected_result, 1563003caf4fSChuck Lever }, 1564003caf4fSChuck Lever }; 1565003caf4fSChuck Lever 1566003caf4fSChuck Lever /* Creates the function rfc8009_checksum_gen_params */ 1567003caf4fSChuck Lever KUNIT_ARRAY_PARAM(rfc8009_checksum, rfc8009_checksum_test_params, 1568003caf4fSChuck Lever gss_krb5_get_desc); 1569003caf4fSChuck Lever 15704d2d15c0SChuck Lever /* 15714d2d15c0SChuck Lever * From RFC 8009 Appendix A. Test Vectors 15724d2d15c0SChuck Lever * 15734d2d15c0SChuck Lever * Sample encryptions (all using the default cipher state): 15744d2d15c0SChuck Lever * -------------------------------------------------------- 15754d2d15c0SChuck Lever * 15764d2d15c0SChuck Lever * These sample encryptions use the above sample key derivation results, 15774d2d15c0SChuck Lever * including use of the same base-key and key usage values. 15784d2d15c0SChuck Lever * 15794d2d15c0SChuck Lever * This test material is copyright (c) 2016 IETF Trust and the 15804d2d15c0SChuck Lever * persons identified as the document authors. All rights reserved. 15814d2d15c0SChuck Lever */ 15824d2d15c0SChuck Lever 15834d2d15c0SChuck Lever static const struct xdr_netobj rfc8009_enc_empty_plaintext = { 15844d2d15c0SChuck Lever .len = 0, 15854d2d15c0SChuck Lever }; 15864d2d15c0SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_short_plaintext, 15874d2d15c0SChuck Lever 0x00, 0x01, 0x02, 0x03, 0x04, 0x05 15884d2d15c0SChuck Lever ); 15894d2d15c0SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_block_plaintext, 15904d2d15c0SChuck Lever 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 15914d2d15c0SChuck Lever 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f 15924d2d15c0SChuck Lever ); 15934d2d15c0SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_long_plaintext, 15944d2d15c0SChuck Lever 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 15954d2d15c0SChuck Lever 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 15964d2d15c0SChuck Lever 0x10, 0x11, 0x12, 0x13, 0x14 15974d2d15c0SChuck Lever ); 15984d2d15c0SChuck Lever 15994d2d15c0SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_test1_confounder, 16004d2d15c0SChuck Lever 0x7e, 0x58, 0x95, 0xea, 0xf2, 0x67, 0x24, 0x35, 16014d2d15c0SChuck Lever 0xba, 0xd8, 0x17, 0xf5, 0x45, 0xa3, 0x71, 0x48 16024d2d15c0SChuck Lever ); 16034d2d15c0SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_test1_expected_result, 16044d2d15c0SChuck Lever 0xef, 0x85, 0xfb, 0x89, 0x0b, 0xb8, 0x47, 0x2f, 16054d2d15c0SChuck Lever 0x4d, 0xab, 0x20, 0x39, 0x4d, 0xca, 0x78, 0x1d 16064d2d15c0SChuck Lever ); 16074d2d15c0SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_test1_expected_hmac, 16084d2d15c0SChuck Lever 0xad, 0x87, 0x7e, 0xda, 0x39, 0xd5, 0x0c, 0x87, 16094d2d15c0SChuck Lever 0x0c, 0x0d, 0x5a, 0x0a, 0x8e, 0x48, 0xc7, 0x18 16104d2d15c0SChuck Lever ); 16114d2d15c0SChuck Lever 16124d2d15c0SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_test2_confounder, 16134d2d15c0SChuck Lever 0x7b, 0xca, 0x28, 0x5e, 0x2f, 0xd4, 0x13, 0x0f, 16144d2d15c0SChuck Lever 0xb5, 0x5b, 0x1a, 0x5c, 0x83, 0xbc, 0x5b, 0x24 16154d2d15c0SChuck Lever ); 16164d2d15c0SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_test2_expected_result, 16174d2d15c0SChuck Lever 0x84, 0xd7, 0xf3, 0x07, 0x54, 0xed, 0x98, 0x7b, 16184d2d15c0SChuck Lever 0xab, 0x0b, 0xf3, 0x50, 0x6b, 0xeb, 0x09, 0xcf, 16194d2d15c0SChuck Lever 0xb5, 0x54, 0x02, 0xce, 0xf7, 0xe6 16204d2d15c0SChuck Lever ); 16214d2d15c0SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_test2_expected_hmac, 16224d2d15c0SChuck Lever 0x87, 0x7c, 0xe9, 0x9e, 0x24, 0x7e, 0x52, 0xd1, 16234d2d15c0SChuck Lever 0x6e, 0xd4, 0x42, 0x1d, 0xfd, 0xf8, 0x97, 0x6c 16244d2d15c0SChuck Lever ); 16254d2d15c0SChuck Lever 16264d2d15c0SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_test3_confounder, 16274d2d15c0SChuck Lever 0x56, 0xab, 0x21, 0x71, 0x3f, 0xf6, 0x2c, 0x0a, 16284d2d15c0SChuck Lever 0x14, 0x57, 0x20, 0x0f, 0x6f, 0xa9, 0x94, 0x8f 16294d2d15c0SChuck Lever ); 16304d2d15c0SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_test3_expected_result, 16314d2d15c0SChuck Lever 0x35, 0x17, 0xd6, 0x40, 0xf5, 0x0d, 0xdc, 0x8a, 16324d2d15c0SChuck Lever 0xd3, 0x62, 0x87, 0x22, 0xb3, 0x56, 0x9d, 0x2a, 16334d2d15c0SChuck Lever 0xe0, 0x74, 0x93, 0xfa, 0x82, 0x63, 0x25, 0x40, 16344d2d15c0SChuck Lever 0x80, 0xea, 0x65, 0xc1, 0x00, 0x8e, 0x8f, 0xc2 16354d2d15c0SChuck Lever ); 16364d2d15c0SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_test3_expected_hmac, 16374d2d15c0SChuck Lever 0x95, 0xfb, 0x48, 0x52, 0xe7, 0xd8, 0x3e, 0x1e, 16384d2d15c0SChuck Lever 0x7c, 0x48, 0xc3, 0x7e, 0xeb, 0xe6, 0xb0, 0xd3 16394d2d15c0SChuck Lever ); 16404d2d15c0SChuck Lever 16414d2d15c0SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_test4_confounder, 16424d2d15c0SChuck Lever 0xa7, 0xa4, 0xe2, 0x9a, 0x47, 0x28, 0xce, 0x10, 16434d2d15c0SChuck Lever 0x66, 0x4f, 0xb6, 0x4e, 0x49, 0xad, 0x3f, 0xac 16444d2d15c0SChuck Lever ); 16454d2d15c0SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_test4_expected_result, 16464d2d15c0SChuck Lever 0x72, 0x0f, 0x73, 0xb1, 0x8d, 0x98, 0x59, 0xcd, 16474d2d15c0SChuck Lever 0x6c, 0xcb, 0x43, 0x46, 0x11, 0x5c, 0xd3, 0x36, 16484d2d15c0SChuck Lever 0xc7, 0x0f, 0x58, 0xed, 0xc0, 0xc4, 0x43, 0x7c, 16494d2d15c0SChuck Lever 0x55, 0x73, 0x54, 0x4c, 0x31, 0xc8, 0x13, 0xbc, 16504d2d15c0SChuck Lever 0xe1, 0xe6, 0xd0, 0x72, 0xc1 16514d2d15c0SChuck Lever ); 16524d2d15c0SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_test4_expected_hmac, 16534d2d15c0SChuck Lever 0x86, 0xb3, 0x9a, 0x41, 0x3c, 0x2f, 0x92, 0xca, 16544d2d15c0SChuck Lever 0x9b, 0x83, 0x34, 0xa2, 0x87, 0xff, 0xcb, 0xfc 16554d2d15c0SChuck Lever ); 16564d2d15c0SChuck Lever 16574d2d15c0SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_test5_confounder, 16584d2d15c0SChuck Lever 0xf7, 0x64, 0xe9, 0xfa, 0x15, 0xc2, 0x76, 0x47, 16594d2d15c0SChuck Lever 0x8b, 0x2c, 0x7d, 0x0c, 0x4e, 0x5f, 0x58, 0xe4 16604d2d15c0SChuck Lever ); 16614d2d15c0SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_test5_expected_result, 16624d2d15c0SChuck Lever 0x41, 0xf5, 0x3f, 0xa5, 0xbf, 0xe7, 0x02, 0x6d, 16634d2d15c0SChuck Lever 0x91, 0xfa, 0xf9, 0xbe, 0x95, 0x91, 0x95, 0xa0 16644d2d15c0SChuck Lever ); 16654d2d15c0SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_test5_expected_hmac, 16664d2d15c0SChuck Lever 0x58, 0x70, 0x72, 0x73, 0xa9, 0x6a, 0x40, 0xf0, 16674d2d15c0SChuck Lever 0xa0, 0x19, 0x60, 0x62, 0x1a, 0xc6, 0x12, 0x74, 16684d2d15c0SChuck Lever 0x8b, 0x9b, 0xbf, 0xbe, 0x7e, 0xb4, 0xce, 0x3c 16694d2d15c0SChuck Lever ); 16704d2d15c0SChuck Lever 16714d2d15c0SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_test6_confounder, 16724d2d15c0SChuck Lever 0xb8, 0x0d, 0x32, 0x51, 0xc1, 0xf6, 0x47, 0x14, 16734d2d15c0SChuck Lever 0x94, 0x25, 0x6f, 0xfe, 0x71, 0x2d, 0x0b, 0x9a 16744d2d15c0SChuck Lever ); 16754d2d15c0SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_test6_expected_result, 16764d2d15c0SChuck Lever 0x4e, 0xd7, 0xb3, 0x7c, 0x2b, 0xca, 0xc8, 0xf7, 16774d2d15c0SChuck Lever 0x4f, 0x23, 0xc1, 0xcf, 0x07, 0xe6, 0x2b, 0xc7, 16784d2d15c0SChuck Lever 0xb7, 0x5f, 0xb3, 0xf6, 0x37, 0xb9 16794d2d15c0SChuck Lever ); 16804d2d15c0SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_test6_expected_hmac, 16814d2d15c0SChuck Lever 0xf5, 0x59, 0xc7, 0xf6, 0x64, 0xf6, 0x9e, 0xab, 16824d2d15c0SChuck Lever 0x7b, 0x60, 0x92, 0x23, 0x75, 0x26, 0xea, 0x0d, 16834d2d15c0SChuck Lever 0x1f, 0x61, 0xcb, 0x20, 0xd6, 0x9d, 0x10, 0xf2 16844d2d15c0SChuck Lever ); 16854d2d15c0SChuck Lever 16864d2d15c0SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_test7_confounder, 16874d2d15c0SChuck Lever 0x53, 0xbf, 0x8a, 0x0d, 0x10, 0x52, 0x65, 0xd4, 16884d2d15c0SChuck Lever 0xe2, 0x76, 0x42, 0x86, 0x24, 0xce, 0x5e, 0x63 16894d2d15c0SChuck Lever ); 16904d2d15c0SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_test7_expected_result, 16914d2d15c0SChuck Lever 0xbc, 0x47, 0xff, 0xec, 0x79, 0x98, 0xeb, 0x91, 16924d2d15c0SChuck Lever 0xe8, 0x11, 0x5c, 0xf8, 0xd1, 0x9d, 0xac, 0x4b, 16934d2d15c0SChuck Lever 0xbb, 0xe2, 0xe1, 0x63, 0xe8, 0x7d, 0xd3, 0x7f, 16944d2d15c0SChuck Lever 0x49, 0xbe, 0xca, 0x92, 0x02, 0x77, 0x64, 0xf6 16954d2d15c0SChuck Lever ); 16964d2d15c0SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_test7_expected_hmac, 16974d2d15c0SChuck Lever 0x8c, 0xf5, 0x1f, 0x14, 0xd7, 0x98, 0xc2, 0x27, 16984d2d15c0SChuck Lever 0x3f, 0x35, 0xdf, 0x57, 0x4d, 0x1f, 0x93, 0x2e, 16994d2d15c0SChuck Lever 0x40, 0xc4, 0xff, 0x25, 0x5b, 0x36, 0xa2, 0x66 17004d2d15c0SChuck Lever ); 17014d2d15c0SChuck Lever 17024d2d15c0SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_test8_confounder, 17034d2d15c0SChuck Lever 0x76, 0x3e, 0x65, 0x36, 0x7e, 0x86, 0x4f, 0x02, 17044d2d15c0SChuck Lever 0xf5, 0x51, 0x53, 0xc7, 0xe3, 0xb5, 0x8a, 0xf1 17054d2d15c0SChuck Lever ); 17064d2d15c0SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_test8_expected_result, 17074d2d15c0SChuck Lever 0x40, 0x01, 0x3e, 0x2d, 0xf5, 0x8e, 0x87, 0x51, 17084d2d15c0SChuck Lever 0x95, 0x7d, 0x28, 0x78, 0xbc, 0xd2, 0xd6, 0xfe, 17094d2d15c0SChuck Lever 0x10, 0x1c, 0xcf, 0xd5, 0x56, 0xcb, 0x1e, 0xae, 17104d2d15c0SChuck Lever 0x79, 0xdb, 0x3c, 0x3e, 0xe8, 0x64, 0x29, 0xf2, 17114d2d15c0SChuck Lever 0xb2, 0xa6, 0x02, 0xac, 0x86 17124d2d15c0SChuck Lever ); 17134d2d15c0SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_test8_expected_hmac, 17144d2d15c0SChuck Lever 0xfe, 0xf6, 0xec, 0xb6, 0x47, 0xd6, 0x29, 0x5f, 17154d2d15c0SChuck Lever 0xae, 0x07, 0x7a, 0x1f, 0xeb, 0x51, 0x75, 0x08, 17164d2d15c0SChuck Lever 0xd2, 0xc1, 0x6b, 0x41, 0x92, 0xe0, 0x1f, 0x62 17174d2d15c0SChuck Lever ); 17184d2d15c0SChuck Lever 17194d2d15c0SChuck Lever static const struct gss_krb5_test_param rfc8009_encrypt_test_params[] = { 17204d2d15c0SChuck Lever { 17214d2d15c0SChuck Lever .desc = "Encrypt empty plaintext with aes128-cts-hmac-sha256-128", 17224d2d15c0SChuck Lever .enctype = ENCTYPE_AES128_CTS_HMAC_SHA256_128, 17234d2d15c0SChuck Lever .plaintext = &rfc8009_enc_empty_plaintext, 17244d2d15c0SChuck Lever .confounder = &rfc8009_enc_test1_confounder, 17254d2d15c0SChuck Lever .base_key = &aes128_cts_hmac_sha256_128_basekey, 17264d2d15c0SChuck Lever .expected_result = &rfc8009_enc_test1_expected_result, 17274d2d15c0SChuck Lever .expected_hmac = &rfc8009_enc_test1_expected_hmac, 17284d2d15c0SChuck Lever }, 17294d2d15c0SChuck Lever { 17304d2d15c0SChuck Lever .desc = "Encrypt short plaintext with aes128-cts-hmac-sha256-128", 17314d2d15c0SChuck Lever .enctype = ENCTYPE_AES128_CTS_HMAC_SHA256_128, 17324d2d15c0SChuck Lever .plaintext = &rfc8009_enc_short_plaintext, 17334d2d15c0SChuck Lever .confounder = &rfc8009_enc_test2_confounder, 17344d2d15c0SChuck Lever .base_key = &aes128_cts_hmac_sha256_128_basekey, 17354d2d15c0SChuck Lever .expected_result = &rfc8009_enc_test2_expected_result, 17364d2d15c0SChuck Lever .expected_hmac = &rfc8009_enc_test2_expected_hmac, 17374d2d15c0SChuck Lever }, 17384d2d15c0SChuck Lever { 17394d2d15c0SChuck Lever .desc = "Encrypt block plaintext with aes128-cts-hmac-sha256-128", 17404d2d15c0SChuck Lever .enctype = ENCTYPE_AES128_CTS_HMAC_SHA256_128, 17414d2d15c0SChuck Lever .plaintext = &rfc8009_enc_block_plaintext, 17424d2d15c0SChuck Lever .confounder = &rfc8009_enc_test3_confounder, 17434d2d15c0SChuck Lever .base_key = &aes128_cts_hmac_sha256_128_basekey, 17444d2d15c0SChuck Lever .expected_result = &rfc8009_enc_test3_expected_result, 17454d2d15c0SChuck Lever .expected_hmac = &rfc8009_enc_test3_expected_hmac, 17464d2d15c0SChuck Lever }, 17474d2d15c0SChuck Lever { 17484d2d15c0SChuck Lever .desc = "Encrypt long plaintext with aes128-cts-hmac-sha256-128", 17494d2d15c0SChuck Lever .enctype = ENCTYPE_AES128_CTS_HMAC_SHA256_128, 17504d2d15c0SChuck Lever .plaintext = &rfc8009_enc_long_plaintext, 17514d2d15c0SChuck Lever .confounder = &rfc8009_enc_test4_confounder, 17524d2d15c0SChuck Lever .base_key = &aes128_cts_hmac_sha256_128_basekey, 17534d2d15c0SChuck Lever .expected_result = &rfc8009_enc_test4_expected_result, 17544d2d15c0SChuck Lever .expected_hmac = &rfc8009_enc_test4_expected_hmac, 17554d2d15c0SChuck Lever }, 17564d2d15c0SChuck Lever { 17574d2d15c0SChuck Lever .desc = "Encrypt empty plaintext with aes256-cts-hmac-sha384-192", 17584d2d15c0SChuck Lever .enctype = ENCTYPE_AES256_CTS_HMAC_SHA384_192, 17594d2d15c0SChuck Lever .plaintext = &rfc8009_enc_empty_plaintext, 17604d2d15c0SChuck Lever .confounder = &rfc8009_enc_test5_confounder, 17614d2d15c0SChuck Lever .base_key = &aes256_cts_hmac_sha384_192_basekey, 17624d2d15c0SChuck Lever .expected_result = &rfc8009_enc_test5_expected_result, 17634d2d15c0SChuck Lever .expected_hmac = &rfc8009_enc_test5_expected_hmac, 17644d2d15c0SChuck Lever }, 17654d2d15c0SChuck Lever { 17664d2d15c0SChuck Lever .desc = "Encrypt short plaintext with aes256-cts-hmac-sha384-192", 17674d2d15c0SChuck Lever .enctype = ENCTYPE_AES256_CTS_HMAC_SHA384_192, 17684d2d15c0SChuck Lever .plaintext = &rfc8009_enc_short_plaintext, 17694d2d15c0SChuck Lever .confounder = &rfc8009_enc_test6_confounder, 17704d2d15c0SChuck Lever .base_key = &aes256_cts_hmac_sha384_192_basekey, 17714d2d15c0SChuck Lever .expected_result = &rfc8009_enc_test6_expected_result, 17724d2d15c0SChuck Lever .expected_hmac = &rfc8009_enc_test6_expected_hmac, 17734d2d15c0SChuck Lever }, 17744d2d15c0SChuck Lever { 17754d2d15c0SChuck Lever .desc = "Encrypt block plaintext with aes256-cts-hmac-sha384-192", 17764d2d15c0SChuck Lever .enctype = ENCTYPE_AES256_CTS_HMAC_SHA384_192, 17774d2d15c0SChuck Lever .plaintext = &rfc8009_enc_block_plaintext, 17784d2d15c0SChuck Lever .confounder = &rfc8009_enc_test7_confounder, 17794d2d15c0SChuck Lever .base_key = &aes256_cts_hmac_sha384_192_basekey, 17804d2d15c0SChuck Lever .expected_result = &rfc8009_enc_test7_expected_result, 17814d2d15c0SChuck Lever .expected_hmac = &rfc8009_enc_test7_expected_hmac, 17824d2d15c0SChuck Lever }, 17834d2d15c0SChuck Lever { 17844d2d15c0SChuck Lever .desc = "Encrypt long plaintext with aes256-cts-hmac-sha384-192", 17854d2d15c0SChuck Lever .enctype = ENCTYPE_AES256_CTS_HMAC_SHA384_192, 17864d2d15c0SChuck Lever .plaintext = &rfc8009_enc_long_plaintext, 17874d2d15c0SChuck Lever .confounder = &rfc8009_enc_test8_confounder, 17884d2d15c0SChuck Lever .base_key = &aes256_cts_hmac_sha384_192_basekey, 17894d2d15c0SChuck Lever .expected_result = &rfc8009_enc_test8_expected_result, 17904d2d15c0SChuck Lever .expected_hmac = &rfc8009_enc_test8_expected_hmac, 17914d2d15c0SChuck Lever }, 17924d2d15c0SChuck Lever }; 17934d2d15c0SChuck Lever 17944d2d15c0SChuck Lever /* Creates the function rfc8009_encrypt_gen_params */ 17954d2d15c0SChuck Lever KUNIT_ARRAY_PARAM(rfc8009_encrypt, rfc8009_encrypt_test_params, 17964d2d15c0SChuck Lever gss_krb5_get_desc); 17974d2d15c0SChuck Lever 17984d2d15c0SChuck Lever static void rfc8009_encrypt_case(struct kunit *test) 17994d2d15c0SChuck Lever { 18004d2d15c0SChuck Lever const struct gss_krb5_test_param *param = test->param_value; 18014d2d15c0SChuck Lever struct crypto_sync_skcipher *cts_tfm, *cbc_tfm; 18024d2d15c0SChuck Lever const struct gss_krb5_enctype *gk5e; 18034d2d15c0SChuck Lever struct xdr_netobj Ke, Ki, checksum; 18044d2d15c0SChuck Lever u8 usage_data[GSS_KRB5_K5CLENGTH]; 18054d2d15c0SChuck Lever struct xdr_netobj usage = { 18064d2d15c0SChuck Lever .data = usage_data, 18074d2d15c0SChuck Lever .len = sizeof(usage_data), 18084d2d15c0SChuck Lever }; 18094d2d15c0SChuck Lever struct crypto_ahash *ahash_tfm; 18104d2d15c0SChuck Lever struct xdr_buf buf; 18114d2d15c0SChuck Lever void *text; 18124d2d15c0SChuck Lever size_t len; 18134d2d15c0SChuck Lever u32 err; 18144d2d15c0SChuck Lever 18154d2d15c0SChuck Lever /* Arrange */ 18164d2d15c0SChuck Lever gk5e = gss_krb5_lookup_enctype(param->enctype); 1817*fe90151cSChuck Lever if (!gk5e) 1818*fe90151cSChuck Lever kunit_skip(test, "Encryption type is not available"); 18194d2d15c0SChuck Lever 18204d2d15c0SChuck Lever *(__be32 *)usage.data = cpu_to_be32(2); 18214d2d15c0SChuck Lever 18224d2d15c0SChuck Lever Ke.len = gk5e->Ke_length; 18234d2d15c0SChuck Lever Ke.data = kunit_kzalloc(test, Ke.len, GFP_KERNEL); 18244d2d15c0SChuck Lever KUNIT_ASSERT_NOT_ERR_OR_NULL(test, Ke.data); 18254d2d15c0SChuck Lever usage.data[4] = KEY_USAGE_SEED_ENCRYPTION; 18264d2d15c0SChuck Lever err = gk5e->derive_key(gk5e, param->base_key, &Ke, 18274d2d15c0SChuck Lever &usage, GFP_KERNEL); 18284d2d15c0SChuck Lever KUNIT_ASSERT_EQ(test, err, 0); 18294d2d15c0SChuck Lever 18304d2d15c0SChuck Lever cbc_tfm = crypto_alloc_sync_skcipher(gk5e->aux_cipher, 0, 0); 18314d2d15c0SChuck Lever KUNIT_ASSERT_NOT_ERR_OR_NULL(test, cbc_tfm); 18324d2d15c0SChuck Lever err = crypto_sync_skcipher_setkey(cbc_tfm, Ke.data, Ke.len); 18334d2d15c0SChuck Lever KUNIT_ASSERT_EQ(test, err, 0); 18344d2d15c0SChuck Lever 18354d2d15c0SChuck Lever cts_tfm = crypto_alloc_sync_skcipher(gk5e->encrypt_name, 0, 0); 18364d2d15c0SChuck Lever KUNIT_ASSERT_NOT_ERR_OR_NULL(test, cts_tfm); 18374d2d15c0SChuck Lever err = crypto_sync_skcipher_setkey(cts_tfm, Ke.data, Ke.len); 18384d2d15c0SChuck Lever KUNIT_ASSERT_EQ(test, err, 0); 18394d2d15c0SChuck Lever 18404d2d15c0SChuck Lever len = param->confounder->len + param->plaintext->len; 18414d2d15c0SChuck Lever text = kunit_kzalloc(test, len, GFP_KERNEL); 18424d2d15c0SChuck Lever KUNIT_ASSERT_NOT_ERR_OR_NULL(test, text); 18434d2d15c0SChuck Lever memcpy(text, param->confounder->data, param->confounder->len); 18444d2d15c0SChuck Lever memcpy(text + param->confounder->len, param->plaintext->data, 18454d2d15c0SChuck Lever param->plaintext->len); 18464d2d15c0SChuck Lever 18474d2d15c0SChuck Lever memset(&buf, 0, sizeof(buf)); 18484d2d15c0SChuck Lever buf.head[0].iov_base = text; 18494d2d15c0SChuck Lever buf.head[0].iov_len = param->confounder->len + param->plaintext->len; 18504d2d15c0SChuck Lever buf.len = buf.head[0].iov_len; 18514d2d15c0SChuck Lever 18524d2d15c0SChuck Lever checksum.len = gk5e->cksumlength; 18534d2d15c0SChuck Lever checksum.data = kunit_kzalloc(test, checksum.len, GFP_KERNEL); 18544d2d15c0SChuck Lever KUNIT_ASSERT_NOT_ERR_OR_NULL(test, checksum.data); 18554d2d15c0SChuck Lever 18564d2d15c0SChuck Lever Ki.len = gk5e->Ki_length; 18574d2d15c0SChuck Lever Ki.data = kunit_kzalloc(test, Ki.len, GFP_KERNEL); 18584d2d15c0SChuck Lever KUNIT_ASSERT_NOT_ERR_OR_NULL(test, Ki.data); 18594d2d15c0SChuck Lever usage.data[4] = KEY_USAGE_SEED_INTEGRITY; 18604d2d15c0SChuck Lever err = gk5e->derive_key(gk5e, param->base_key, &Ki, 18614d2d15c0SChuck Lever &usage, GFP_KERNEL); 18624d2d15c0SChuck Lever KUNIT_ASSERT_EQ(test, err, 0); 18634d2d15c0SChuck Lever 18644d2d15c0SChuck Lever ahash_tfm = crypto_alloc_ahash(gk5e->cksum_name, 0, CRYPTO_ALG_ASYNC); 18654d2d15c0SChuck Lever KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ahash_tfm); 18664d2d15c0SChuck Lever err = crypto_ahash_setkey(ahash_tfm, Ki.data, Ki.len); 18674d2d15c0SChuck Lever KUNIT_ASSERT_EQ(test, err, 0); 18684d2d15c0SChuck Lever 18694d2d15c0SChuck Lever /* Act */ 18704d2d15c0SChuck Lever err = krb5_cbc_cts_encrypt(cts_tfm, cbc_tfm, 0, &buf, NULL, NULL, 0); 18714d2d15c0SChuck Lever KUNIT_ASSERT_EQ(test, err, 0); 18724d2d15c0SChuck Lever err = krb5_etm_checksum(cts_tfm, ahash_tfm, &buf, 0, &checksum); 18734d2d15c0SChuck Lever KUNIT_ASSERT_EQ(test, err, 0); 18744d2d15c0SChuck Lever 18754d2d15c0SChuck Lever /* Assert */ 18764d2d15c0SChuck Lever KUNIT_EXPECT_EQ_MSG(test, 18774d2d15c0SChuck Lever param->expected_result->len, buf.len, 18784d2d15c0SChuck Lever "ciphertext length mismatch"); 18794d2d15c0SChuck Lever KUNIT_EXPECT_EQ_MSG(test, 18804d2d15c0SChuck Lever memcmp(param->expected_result->data, 18814d2d15c0SChuck Lever buf.head[0].iov_base, 18824d2d15c0SChuck Lever param->expected_result->len), 0, 18834d2d15c0SChuck Lever "ciphertext mismatch"); 18844d2d15c0SChuck Lever KUNIT_EXPECT_EQ_MSG(test, memcmp(param->expected_hmac->data, 18854d2d15c0SChuck Lever checksum.data, 18864d2d15c0SChuck Lever checksum.len), 0, 18874d2d15c0SChuck Lever "HMAC mismatch"); 18884d2d15c0SChuck Lever 18894d2d15c0SChuck Lever crypto_free_ahash(ahash_tfm); 18904d2d15c0SChuck Lever crypto_free_sync_skcipher(cts_tfm); 18914d2d15c0SChuck Lever crypto_free_sync_skcipher(cbc_tfm); 18924d2d15c0SChuck Lever } 18934d2d15c0SChuck Lever 1894fcbad14bSChuck Lever static struct kunit_case rfc8009_test_cases[] = { 1895fcbad14bSChuck Lever { 1896fcbad14bSChuck Lever .name = "RFC 8009 key derivation", 1897fcbad14bSChuck Lever .run_case = kdf_case, 1898fcbad14bSChuck Lever .generate_params = rfc8009_kdf_gen_params, 1899fcbad14bSChuck Lever }, 1900003caf4fSChuck Lever { 1901003caf4fSChuck Lever .name = "RFC 8009 checksum", 1902003caf4fSChuck Lever .run_case = checksum_case, 1903003caf4fSChuck Lever .generate_params = rfc8009_checksum_gen_params, 1904003caf4fSChuck Lever }, 19054d2d15c0SChuck Lever { 19064d2d15c0SChuck Lever .name = "RFC 8009 encryption", 19074d2d15c0SChuck Lever .run_case = rfc8009_encrypt_case, 19084d2d15c0SChuck Lever .generate_params = rfc8009_encrypt_gen_params, 19094d2d15c0SChuck Lever }, 1910fcbad14bSChuck Lever }; 1911fcbad14bSChuck Lever 1912fcbad14bSChuck Lever static struct kunit_suite rfc8009_suite = { 1913fcbad14bSChuck Lever .name = "RFC 8009 suite", 1914fcbad14bSChuck Lever .test_cases = rfc8009_test_cases, 1915fcbad14bSChuck Lever }; 1916fcbad14bSChuck Lever 1917c4a9f055SChuck Lever /* 1918c4a9f055SChuck Lever * Encryption self-tests 1919c4a9f055SChuck Lever */ 1920c4a9f055SChuck Lever 1921c4a9f055SChuck Lever DEFINE_STR_XDR_NETOBJ(encrypt_selftest_plaintext, 1922c4a9f055SChuck Lever "This is the plaintext for the encryption self-test."); 1923c4a9f055SChuck Lever 1924c4a9f055SChuck Lever static const struct gss_krb5_test_param encrypt_selftest_params[] = { 1925c4a9f055SChuck Lever { 1926c4a9f055SChuck Lever .desc = "aes128-cts-hmac-sha1-96 encryption self-test", 1927c4a9f055SChuck Lever .enctype = ENCTYPE_AES128_CTS_HMAC_SHA1_96, 1928c4a9f055SChuck Lever .Ke = &rfc3962_encryption_key, 1929c4a9f055SChuck Lever .plaintext = &encrypt_selftest_plaintext, 1930c4a9f055SChuck Lever }, 1931c4a9f055SChuck Lever { 1932c4a9f055SChuck Lever .desc = "aes256-cts-hmac-sha1-96 encryption self-test", 1933c4a9f055SChuck Lever .enctype = ENCTYPE_AES256_CTS_HMAC_SHA1_96, 1934c4a9f055SChuck Lever .Ke = &rfc3962_encryption_key, 1935c4a9f055SChuck Lever .plaintext = &encrypt_selftest_plaintext, 1936c4a9f055SChuck Lever }, 1937c4a9f055SChuck Lever { 1938c4a9f055SChuck Lever .desc = "camellia128-cts-cmac encryption self-test", 1939c4a9f055SChuck Lever .enctype = ENCTYPE_CAMELLIA128_CTS_CMAC, 1940c4a9f055SChuck Lever .Ke = &camellia128_cts_cmac_Ke, 1941c4a9f055SChuck Lever .plaintext = &encrypt_selftest_plaintext, 1942c4a9f055SChuck Lever }, 1943c4a9f055SChuck Lever { 1944c4a9f055SChuck Lever .desc = "camellia256-cts-cmac encryption self-test", 1945c4a9f055SChuck Lever .enctype = ENCTYPE_CAMELLIA256_CTS_CMAC, 1946c4a9f055SChuck Lever .Ke = &camellia256_cts_cmac_Ke, 1947c4a9f055SChuck Lever .plaintext = &encrypt_selftest_plaintext, 1948c4a9f055SChuck Lever }, 1949c4a9f055SChuck Lever { 1950c4a9f055SChuck Lever .desc = "aes128-cts-hmac-sha256-128 encryption self-test", 1951c4a9f055SChuck Lever .enctype = ENCTYPE_AES128_CTS_HMAC_SHA256_128, 1952c4a9f055SChuck Lever .Ke = &aes128_cts_hmac_sha256_128_Ke, 1953c4a9f055SChuck Lever .plaintext = &encrypt_selftest_plaintext, 1954c4a9f055SChuck Lever }, 1955c4a9f055SChuck Lever { 1956c4a9f055SChuck Lever .desc = "aes256-cts-hmac-sha384-192 encryption self-test", 1957c4a9f055SChuck Lever .enctype = ENCTYPE_AES256_CTS_HMAC_SHA384_192, 1958c4a9f055SChuck Lever .Ke = &aes256_cts_hmac_sha384_192_Ke, 1959c4a9f055SChuck Lever .plaintext = &encrypt_selftest_plaintext, 1960c4a9f055SChuck Lever }, 1961c4a9f055SChuck Lever }; 1962c4a9f055SChuck Lever 1963c4a9f055SChuck Lever /* Creates the function encrypt_selftest_gen_params */ 1964c4a9f055SChuck Lever KUNIT_ARRAY_PARAM(encrypt_selftest, encrypt_selftest_params, 1965c4a9f055SChuck Lever gss_krb5_get_desc); 1966c4a9f055SChuck Lever 1967c4a9f055SChuck Lever /* 1968c4a9f055SChuck Lever * Encrypt and decrypt plaintext, and ensure the input plaintext 1969c4a9f055SChuck Lever * matches the output plaintext. A confounder is not added in this 1970c4a9f055SChuck Lever * case. 1971c4a9f055SChuck Lever */ 1972c4a9f055SChuck Lever static void encrypt_selftest_case(struct kunit *test) 1973c4a9f055SChuck Lever { 1974c4a9f055SChuck Lever const struct gss_krb5_test_param *param = test->param_value; 1975c4a9f055SChuck Lever struct crypto_sync_skcipher *cts_tfm, *cbc_tfm; 1976c4a9f055SChuck Lever const struct gss_krb5_enctype *gk5e; 1977c4a9f055SChuck Lever struct xdr_buf buf; 1978c4a9f055SChuck Lever void *text; 1979c4a9f055SChuck Lever int err; 1980c4a9f055SChuck Lever 1981c4a9f055SChuck Lever /* Arrange */ 1982c4a9f055SChuck Lever gk5e = gss_krb5_lookup_enctype(param->enctype); 1983*fe90151cSChuck Lever if (!gk5e) 1984*fe90151cSChuck Lever kunit_skip(test, "Encryption type is not available"); 1985c4a9f055SChuck Lever 1986c4a9f055SChuck Lever cbc_tfm = crypto_alloc_sync_skcipher(gk5e->aux_cipher, 0, 0); 1987c4a9f055SChuck Lever KUNIT_ASSERT_NOT_ERR_OR_NULL(test, cbc_tfm); 1988c4a9f055SChuck Lever err = crypto_sync_skcipher_setkey(cbc_tfm, param->Ke->data, param->Ke->len); 1989c4a9f055SChuck Lever KUNIT_ASSERT_EQ(test, err, 0); 1990c4a9f055SChuck Lever 1991c4a9f055SChuck Lever cts_tfm = crypto_alloc_sync_skcipher(gk5e->encrypt_name, 0, 0); 1992c4a9f055SChuck Lever KUNIT_ASSERT_NOT_ERR_OR_NULL(test, cts_tfm); 1993c4a9f055SChuck Lever err = crypto_sync_skcipher_setkey(cts_tfm, param->Ke->data, param->Ke->len); 1994c4a9f055SChuck Lever KUNIT_ASSERT_EQ(test, err, 0); 1995c4a9f055SChuck Lever 1996c4a9f055SChuck Lever text = kunit_kzalloc(test, roundup(param->plaintext->len, 1997c4a9f055SChuck Lever crypto_sync_skcipher_blocksize(cbc_tfm)), 1998c4a9f055SChuck Lever GFP_KERNEL); 1999c4a9f055SChuck Lever KUNIT_ASSERT_NOT_ERR_OR_NULL(test, text); 2000c4a9f055SChuck Lever 2001c4a9f055SChuck Lever memcpy(text, param->plaintext->data, param->plaintext->len); 2002c4a9f055SChuck Lever memset(&buf, 0, sizeof(buf)); 2003c4a9f055SChuck Lever buf.head[0].iov_base = text; 2004c4a9f055SChuck Lever buf.head[0].iov_len = param->plaintext->len; 2005c4a9f055SChuck Lever buf.len = buf.head[0].iov_len; 2006c4a9f055SChuck Lever 2007c4a9f055SChuck Lever /* Act */ 2008c4a9f055SChuck Lever err = krb5_cbc_cts_encrypt(cts_tfm, cbc_tfm, 0, &buf, NULL, NULL, 0); 2009c4a9f055SChuck Lever KUNIT_ASSERT_EQ(test, err, 0); 2010c4a9f055SChuck Lever err = krb5_cbc_cts_decrypt(cts_tfm, cbc_tfm, 0, &buf); 2011c4a9f055SChuck Lever KUNIT_ASSERT_EQ(test, err, 0); 2012c4a9f055SChuck Lever 2013c4a9f055SChuck Lever /* Assert */ 2014c4a9f055SChuck Lever KUNIT_EXPECT_EQ_MSG(test, 2015c4a9f055SChuck Lever param->plaintext->len, buf.len, 2016c4a9f055SChuck Lever "length mismatch"); 2017c4a9f055SChuck Lever KUNIT_EXPECT_EQ_MSG(test, 2018c4a9f055SChuck Lever memcmp(param->plaintext->data, 2019c4a9f055SChuck Lever buf.head[0].iov_base, buf.len), 0, 2020c4a9f055SChuck Lever "plaintext mismatch"); 2021c4a9f055SChuck Lever 2022c4a9f055SChuck Lever crypto_free_sync_skcipher(cts_tfm); 2023c4a9f055SChuck Lever crypto_free_sync_skcipher(cbc_tfm); 2024c4a9f055SChuck Lever } 2025c4a9f055SChuck Lever 2026c4a9f055SChuck Lever static struct kunit_case encryption_test_cases[] = { 2027c4a9f055SChuck Lever { 2028c4a9f055SChuck Lever .name = "Encryption self-tests", 2029c4a9f055SChuck Lever .run_case = encrypt_selftest_case, 2030c4a9f055SChuck Lever .generate_params = encrypt_selftest_gen_params, 2031c4a9f055SChuck Lever }, 2032c4a9f055SChuck Lever }; 2033c4a9f055SChuck Lever 2034c4a9f055SChuck Lever static struct kunit_suite encryption_test_suite = { 2035c4a9f055SChuck Lever .name = "Encryption test suite", 2036c4a9f055SChuck Lever .test_cases = encryption_test_cases, 2037c4a9f055SChuck Lever }; 2038c4a9f055SChuck Lever 2039e1a9a384SChuck Lever kunit_test_suites(&rfc3961_suite, 204035f6e42eSChuck Lever &rfc3962_suite, 2041fcbad14bSChuck Lever &rfc6803_suite, 2042c4a9f055SChuck Lever &rfc8009_suite, 2043c4a9f055SChuck Lever &encryption_test_suite); 2044eebd8c2dSChuck Lever 2045eebd8c2dSChuck Lever MODULE_DESCRIPTION("Test RPCSEC GSS Kerberos 5 functions"); 2046eebd8c2dSChuck Lever MODULE_LICENSE("GPL"); 2047