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