1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * Copyright (c) 2022 Oracle and/or its affiliates. 4 * 5 * KUnit test of SunRPC's GSS Kerberos mechanism. Subsystem 6 * name is "rpcsec_gss_krb5". 7 */ 8 9 #include <kunit/test.h> 10 #include <kunit/visibility.h> 11 12 #include <linux/kernel.h> 13 #include <crypto/hash.h> 14 15 #include <linux/sunrpc/xdr.h> 16 #include <linux/sunrpc/gss_krb5.h> 17 18 #include "gss_krb5_internal.h" 19 20 MODULE_IMPORT_NS(EXPORTED_FOR_KUNIT_TESTING); 21 22 struct gss_krb5_test_param { 23 const char *desc; 24 u32 enctype; 25 u32 nfold; 26 u32 constant; 27 const struct xdr_netobj *base_key; 28 const struct xdr_netobj *Ke; 29 const struct xdr_netobj *usage; 30 const struct xdr_netobj *plaintext; 31 const struct xdr_netobj *confounder; 32 const struct xdr_netobj *expected_result; 33 const struct xdr_netobj *expected_hmac; 34 const struct xdr_netobj *next_iv; 35 }; 36 37 static inline void gss_krb5_get_desc(const struct gss_krb5_test_param *param, 38 char *desc) 39 { 40 strscpy(desc, param->desc, KUNIT_PARAM_DESC_SIZE); 41 } 42 43 static void kdf_case(struct kunit *test) 44 { 45 const struct gss_krb5_test_param *param = test->param_value; 46 const struct gss_krb5_enctype *gk5e; 47 struct xdr_netobj derivedkey; 48 int err; 49 50 /* Arrange */ 51 gk5e = gss_krb5_lookup_enctype(param->enctype); 52 if (!gk5e) 53 kunit_skip(test, "Encryption type is not available"); 54 55 derivedkey.data = kunit_kzalloc(test, param->expected_result->len, 56 GFP_KERNEL); 57 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, derivedkey.data); 58 derivedkey.len = param->expected_result->len; 59 60 /* Act */ 61 err = gk5e->derive_key(gk5e, param->base_key, &derivedkey, 62 param->usage, GFP_KERNEL); 63 KUNIT_ASSERT_EQ(test, err, 0); 64 65 /* Assert */ 66 KUNIT_EXPECT_EQ_MSG(test, 67 memcmp(param->expected_result->data, 68 derivedkey.data, derivedkey.len), 0, 69 "key mismatch"); 70 } 71 72 static void checksum_case(struct kunit *test) 73 { 74 const struct gss_krb5_test_param *param = test->param_value; 75 struct xdr_buf buf = { 76 .head[0].iov_len = param->plaintext->len, 77 .len = param->plaintext->len, 78 }; 79 const struct gss_krb5_enctype *gk5e; 80 struct xdr_netobj Kc, checksum; 81 struct crypto_ahash *tfm; 82 int err; 83 84 /* Arrange */ 85 gk5e = gss_krb5_lookup_enctype(param->enctype); 86 if (!gk5e) 87 kunit_skip(test, "Encryption type is not available"); 88 89 Kc.len = gk5e->Kc_length; 90 Kc.data = kunit_kzalloc(test, Kc.len, GFP_KERNEL); 91 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, Kc.data); 92 err = gk5e->derive_key(gk5e, param->base_key, &Kc, 93 param->usage, GFP_KERNEL); 94 KUNIT_ASSERT_EQ(test, err, 0); 95 96 tfm = crypto_alloc_ahash(gk5e->cksum_name, 0, CRYPTO_ALG_ASYNC); 97 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, tfm); 98 err = crypto_ahash_setkey(tfm, Kc.data, Kc.len); 99 KUNIT_ASSERT_EQ(test, err, 0); 100 101 buf.head[0].iov_base = kunit_kzalloc(test, buf.head[0].iov_len, GFP_KERNEL); 102 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, buf.head[0].iov_base); 103 memcpy(buf.head[0].iov_base, param->plaintext->data, buf.head[0].iov_len); 104 105 checksum.len = gk5e->cksumlength; 106 checksum.data = kunit_kzalloc(test, checksum.len, GFP_KERNEL); 107 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, checksum.data); 108 109 /* Act */ 110 err = gss_krb5_checksum(tfm, NULL, 0, &buf, 0, &checksum); 111 KUNIT_ASSERT_EQ(test, err, 0); 112 113 /* Assert */ 114 KUNIT_EXPECT_EQ_MSG(test, 115 memcmp(param->expected_result->data, 116 checksum.data, checksum.len), 0, 117 "checksum mismatch"); 118 119 crypto_free_ahash(tfm); 120 } 121 122 #define DEFINE_HEX_XDR_NETOBJ(name, hex_array...) \ 123 static const u8 name ## _data[] = { hex_array }; \ 124 static const struct xdr_netobj name = { \ 125 .data = (u8 *)name##_data, \ 126 .len = sizeof(name##_data), \ 127 } 128 129 #define DEFINE_STR_XDR_NETOBJ(name, string) \ 130 static const u8 name ## _str[] = string; \ 131 static const struct xdr_netobj name = { \ 132 .data = (u8 *)name##_str, \ 133 .len = sizeof(name##_str) - 1, \ 134 } 135 136 /* 137 * RFC 3961 Appendix A.1. n-fold 138 * 139 * The n-fold function is defined in section 5.1 of RFC 3961. 140 * 141 * This test material is copyright (C) The Internet Society (2005). 142 */ 143 144 DEFINE_HEX_XDR_NETOBJ(nfold_test1_plaintext, 145 0x30, 0x31, 0x32, 0x33, 0x34, 0x35 146 ); 147 DEFINE_HEX_XDR_NETOBJ(nfold_test1_expected_result, 148 0xbe, 0x07, 0x26, 0x31, 0x27, 0x6b, 0x19, 0x55 149 ); 150 151 DEFINE_HEX_XDR_NETOBJ(nfold_test2_plaintext, 152 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64 153 ); 154 DEFINE_HEX_XDR_NETOBJ(nfold_test2_expected_result, 155 0x78, 0xa0, 0x7b, 0x6c, 0xaf, 0x85, 0xfa 156 ); 157 158 DEFINE_HEX_XDR_NETOBJ(nfold_test3_plaintext, 159 0x52, 0x6f, 0x75, 0x67, 0x68, 0x20, 0x43, 0x6f, 160 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x2c, 161 0x20, 0x61, 0x6e, 0x64, 0x20, 0x52, 0x75, 0x6e, 162 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x43, 0x6f, 0x64, 163 0x65 164 ); 165 DEFINE_HEX_XDR_NETOBJ(nfold_test3_expected_result, 166 0xbb, 0x6e, 0xd3, 0x08, 0x70, 0xb7, 0xf0, 0xe0 167 ); 168 169 DEFINE_HEX_XDR_NETOBJ(nfold_test4_plaintext, 170 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64 171 ); 172 DEFINE_HEX_XDR_NETOBJ(nfold_test4_expected_result, 173 0x59, 0xe4, 0xa8, 0xca, 0x7c, 0x03, 0x85, 0xc3, 174 0xc3, 0x7b, 0x3f, 0x6d, 0x20, 0x00, 0x24, 0x7c, 175 0xb6, 0xe6, 0xbd, 0x5b, 0x3e 176 ); 177 178 DEFINE_HEX_XDR_NETOBJ(nfold_test5_plaintext, 179 0x4d, 0x41, 0x53, 0x53, 0x41, 0x43, 0x48, 0x56, 180 0x53, 0x45, 0x54, 0x54, 0x53, 0x20, 0x49, 0x4e, 181 0x53, 0x54, 0x49, 0x54, 0x56, 0x54, 0x45, 0x20, 182 0x4f, 0x46, 0x20, 0x54, 0x45, 0x43, 0x48, 0x4e, 183 0x4f, 0x4c, 0x4f, 0x47, 0x59 184 ); 185 DEFINE_HEX_XDR_NETOBJ(nfold_test5_expected_result, 186 0xdb, 0x3b, 0x0d, 0x8f, 0x0b, 0x06, 0x1e, 0x60, 187 0x32, 0x82, 0xb3, 0x08, 0xa5, 0x08, 0x41, 0x22, 188 0x9a, 0xd7, 0x98, 0xfa, 0xb9, 0x54, 0x0c, 0x1b 189 ); 190 191 DEFINE_HEX_XDR_NETOBJ(nfold_test6_plaintext, 192 0x51 193 ); 194 DEFINE_HEX_XDR_NETOBJ(nfold_test6_expected_result, 195 0x51, 0x8a, 0x54, 0xa2, 0x15, 0xa8, 0x45, 0x2a, 196 0x51, 0x8a, 0x54, 0xa2, 0x15, 0xa8, 0x45, 0x2a, 197 0x51, 0x8a, 0x54, 0xa2, 0x15 198 ); 199 200 DEFINE_HEX_XDR_NETOBJ(nfold_test7_plaintext, 201 0x62, 0x61 202 ); 203 DEFINE_HEX_XDR_NETOBJ(nfold_test7_expected_result, 204 0xfb, 0x25, 0xd5, 0x31, 0xae, 0x89, 0x74, 0x49, 205 0x9f, 0x52, 0xfd, 0x92, 0xea, 0x98, 0x57, 0xc4, 206 0xba, 0x24, 0xcf, 0x29, 0x7e 207 ); 208 209 DEFINE_HEX_XDR_NETOBJ(nfold_test_kerberos, 210 0x6b, 0x65, 0x72, 0x62, 0x65, 0x72, 0x6f, 0x73 211 ); 212 DEFINE_HEX_XDR_NETOBJ(nfold_test8_expected_result, 213 0x6b, 0x65, 0x72, 0x62, 0x65, 0x72, 0x6f, 0x73 214 ); 215 DEFINE_HEX_XDR_NETOBJ(nfold_test9_expected_result, 216 0x6b, 0x65, 0x72, 0x62, 0x65, 0x72, 0x6f, 0x73, 217 0x7b, 0x9b, 0x5b, 0x2b, 0x93, 0x13, 0x2b, 0x93 218 ); 219 DEFINE_HEX_XDR_NETOBJ(nfold_test10_expected_result, 220 0x83, 0x72, 0xc2, 0x36, 0x34, 0x4e, 0x5f, 0x15, 221 0x50, 0xcd, 0x07, 0x47, 0xe1, 0x5d, 0x62, 0xca, 222 0x7a, 0x5a, 0x3b, 0xce, 0xa4 223 ); 224 DEFINE_HEX_XDR_NETOBJ(nfold_test11_expected_result, 225 0x6b, 0x65, 0x72, 0x62, 0x65, 0x72, 0x6f, 0x73, 226 0x7b, 0x9b, 0x5b, 0x2b, 0x93, 0x13, 0x2b, 0x93, 227 0x5c, 0x9b, 0xdc, 0xda, 0xd9, 0x5c, 0x98, 0x99, 228 0xc4, 0xca, 0xe4, 0xde, 0xe6, 0xd6, 0xca, 0xe4 229 ); 230 231 static const struct gss_krb5_test_param rfc3961_nfold_test_params[] = { 232 { 233 .desc = "64-fold(\"012345\")", 234 .nfold = 64, 235 .plaintext = &nfold_test1_plaintext, 236 .expected_result = &nfold_test1_expected_result, 237 }, 238 { 239 .desc = "56-fold(\"password\")", 240 .nfold = 56, 241 .plaintext = &nfold_test2_plaintext, 242 .expected_result = &nfold_test2_expected_result, 243 }, 244 { 245 .desc = "64-fold(\"Rough Consensus, and Running Code\")", 246 .nfold = 64, 247 .plaintext = &nfold_test3_plaintext, 248 .expected_result = &nfold_test3_expected_result, 249 }, 250 { 251 .desc = "168-fold(\"password\")", 252 .nfold = 168, 253 .plaintext = &nfold_test4_plaintext, 254 .expected_result = &nfold_test4_expected_result, 255 }, 256 { 257 .desc = "192-fold(\"MASSACHVSETTS INSTITVTE OF TECHNOLOGY\")", 258 .nfold = 192, 259 .plaintext = &nfold_test5_plaintext, 260 .expected_result = &nfold_test5_expected_result, 261 }, 262 { 263 .desc = "168-fold(\"Q\")", 264 .nfold = 168, 265 .plaintext = &nfold_test6_plaintext, 266 .expected_result = &nfold_test6_expected_result, 267 }, 268 { 269 .desc = "168-fold(\"ba\")", 270 .nfold = 168, 271 .plaintext = &nfold_test7_plaintext, 272 .expected_result = &nfold_test7_expected_result, 273 }, 274 { 275 .desc = "64-fold(\"kerberos\")", 276 .nfold = 64, 277 .plaintext = &nfold_test_kerberos, 278 .expected_result = &nfold_test8_expected_result, 279 }, 280 { 281 .desc = "128-fold(\"kerberos\")", 282 .nfold = 128, 283 .plaintext = &nfold_test_kerberos, 284 .expected_result = &nfold_test9_expected_result, 285 }, 286 { 287 .desc = "168-fold(\"kerberos\")", 288 .nfold = 168, 289 .plaintext = &nfold_test_kerberos, 290 .expected_result = &nfold_test10_expected_result, 291 }, 292 { 293 .desc = "256-fold(\"kerberos\")", 294 .nfold = 256, 295 .plaintext = &nfold_test_kerberos, 296 .expected_result = &nfold_test11_expected_result, 297 }, 298 }; 299 300 /* Creates the function rfc3961_nfold_gen_params */ 301 KUNIT_ARRAY_PARAM(rfc3961_nfold, rfc3961_nfold_test_params, gss_krb5_get_desc); 302 303 static void rfc3961_nfold_case(struct kunit *test) 304 { 305 const struct gss_krb5_test_param *param = test->param_value; 306 u8 *result; 307 308 /* Arrange */ 309 result = kunit_kzalloc(test, 4096, GFP_KERNEL); 310 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, result); 311 312 /* Act */ 313 krb5_nfold(param->plaintext->len * 8, param->plaintext->data, 314 param->expected_result->len * 8, result); 315 316 /* Assert */ 317 KUNIT_EXPECT_EQ_MSG(test, 318 memcmp(param->expected_result->data, 319 result, param->expected_result->len), 0, 320 "result mismatch"); 321 } 322 323 static struct kunit_case rfc3961_test_cases[] = { 324 { 325 .name = "RFC 3961 n-fold", 326 .run_case = rfc3961_nfold_case, 327 .generate_params = rfc3961_nfold_gen_params, 328 }, 329 {} 330 }; 331 332 static struct kunit_suite rfc3961_suite = { 333 .name = "RFC 3961 tests", 334 .test_cases = rfc3961_test_cases, 335 }; 336 337 /* 338 * From RFC 3962 Appendix B: Sample Test Vectors 339 * 340 * Some test vectors for CBC with ciphertext stealing, using an 341 * initial vector of all-zero. 342 * 343 * This test material is copyright (C) The Internet Society (2005). 344 */ 345 346 DEFINE_HEX_XDR_NETOBJ(rfc3962_encryption_key, 347 0x63, 0x68, 0x69, 0x63, 0x6b, 0x65, 0x6e, 0x20, 348 0x74, 0x65, 0x72, 0x69, 0x79, 0x61, 0x6b, 0x69 349 ); 350 351 DEFINE_HEX_XDR_NETOBJ(rfc3962_enc_test1_plaintext, 352 0x49, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20, 353 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65, 354 0x20 355 ); 356 DEFINE_HEX_XDR_NETOBJ(rfc3962_enc_test1_expected_result, 357 0xc6, 0x35, 0x35, 0x68, 0xf2, 0xbf, 0x8c, 0xb4, 358 0xd8, 0xa5, 0x80, 0x36, 0x2d, 0xa7, 0xff, 0x7f, 359 0x97 360 ); 361 DEFINE_HEX_XDR_NETOBJ(rfc3962_enc_test1_next_iv, 362 0xc6, 0x35, 0x35, 0x68, 0xf2, 0xbf, 0x8c, 0xb4, 363 0xd8, 0xa5, 0x80, 0x36, 0x2d, 0xa7, 0xff, 0x7f 364 ); 365 366 DEFINE_HEX_XDR_NETOBJ(rfc3962_enc_test2_plaintext, 367 0x49, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20, 368 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65, 369 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 370 0x20, 0x47, 0x61, 0x75, 0x27, 0x73, 0x20 371 ); 372 DEFINE_HEX_XDR_NETOBJ(rfc3962_enc_test2_expected_result, 373 0xfc, 0x00, 0x78, 0x3e, 0x0e, 0xfd, 0xb2, 0xc1, 374 0xd4, 0x45, 0xd4, 0xc8, 0xef, 0xf7, 0xed, 0x22, 375 0x97, 0x68, 0x72, 0x68, 0xd6, 0xec, 0xcc, 0xc0, 376 0xc0, 0x7b, 0x25, 0xe2, 0x5e, 0xcf, 0xe5 377 ); 378 DEFINE_HEX_XDR_NETOBJ(rfc3962_enc_test2_next_iv, 379 0xfc, 0x00, 0x78, 0x3e, 0x0e, 0xfd, 0xb2, 0xc1, 380 0xd4, 0x45, 0xd4, 0xc8, 0xef, 0xf7, 0xed, 0x22 381 ); 382 383 DEFINE_HEX_XDR_NETOBJ(rfc3962_enc_test3_plaintext, 384 0x49, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20, 385 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65, 386 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 387 0x20, 0x47, 0x61, 0x75, 0x27, 0x73, 0x20, 0x43 388 ); 389 DEFINE_HEX_XDR_NETOBJ(rfc3962_enc_test3_expected_result, 390 0x39, 0x31, 0x25, 0x23, 0xa7, 0x86, 0x62, 0xd5, 391 0xbe, 0x7f, 0xcb, 0xcc, 0x98, 0xeb, 0xf5, 0xa8, 392 0x97, 0x68, 0x72, 0x68, 0xd6, 0xec, 0xcc, 0xc0, 393 0xc0, 0x7b, 0x25, 0xe2, 0x5e, 0xcf, 0xe5, 0x84 394 ); 395 DEFINE_HEX_XDR_NETOBJ(rfc3962_enc_test3_next_iv, 396 0x39, 0x31, 0x25, 0x23, 0xa7, 0x86, 0x62, 0xd5, 397 0xbe, 0x7f, 0xcb, 0xcc, 0x98, 0xeb, 0xf5, 0xa8 398 ); 399 400 DEFINE_HEX_XDR_NETOBJ(rfc3962_enc_test4_plaintext, 401 0x49, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20, 402 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65, 403 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 404 0x20, 0x47, 0x61, 0x75, 0x27, 0x73, 0x20, 0x43, 405 0x68, 0x69, 0x63, 0x6b, 0x65, 0x6e, 0x2c, 0x20, 406 0x70, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2c 407 ); 408 DEFINE_HEX_XDR_NETOBJ(rfc3962_enc_test4_expected_result, 409 0x97, 0x68, 0x72, 0x68, 0xd6, 0xec, 0xcc, 0xc0, 410 0xc0, 0x7b, 0x25, 0xe2, 0x5e, 0xcf, 0xe5, 0x84, 411 0xb3, 0xff, 0xfd, 0x94, 0x0c, 0x16, 0xa1, 0x8c, 412 0x1b, 0x55, 0x49, 0xd2, 0xf8, 0x38, 0x02, 0x9e, 413 0x39, 0x31, 0x25, 0x23, 0xa7, 0x86, 0x62, 0xd5, 414 0xbe, 0x7f, 0xcb, 0xcc, 0x98, 0xeb, 0xf5 415 ); 416 DEFINE_HEX_XDR_NETOBJ(rfc3962_enc_test4_next_iv, 417 0xb3, 0xff, 0xfd, 0x94, 0x0c, 0x16, 0xa1, 0x8c, 418 0x1b, 0x55, 0x49, 0xd2, 0xf8, 0x38, 0x02, 0x9e 419 ); 420 421 DEFINE_HEX_XDR_NETOBJ(rfc3962_enc_test5_plaintext, 422 0x49, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20, 423 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65, 424 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 425 0x20, 0x47, 0x61, 0x75, 0x27, 0x73, 0x20, 0x43, 426 0x68, 0x69, 0x63, 0x6b, 0x65, 0x6e, 0x2c, 0x20, 427 0x70, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2c, 0x20 428 ); 429 DEFINE_HEX_XDR_NETOBJ(rfc3962_enc_test5_expected_result, 430 0x97, 0x68, 0x72, 0x68, 0xd6, 0xec, 0xcc, 0xc0, 431 0xc0, 0x7b, 0x25, 0xe2, 0x5e, 0xcf, 0xe5, 0x84, 432 0x9d, 0xad, 0x8b, 0xbb, 0x96, 0xc4, 0xcd, 0xc0, 433 0x3b, 0xc1, 0x03, 0xe1, 0xa1, 0x94, 0xbb, 0xd8, 434 0x39, 0x31, 0x25, 0x23, 0xa7, 0x86, 0x62, 0xd5, 435 0xbe, 0x7f, 0xcb, 0xcc, 0x98, 0xeb, 0xf5, 0xa8 436 ); 437 DEFINE_HEX_XDR_NETOBJ(rfc3962_enc_test5_next_iv, 438 0x9d, 0xad, 0x8b, 0xbb, 0x96, 0xc4, 0xcd, 0xc0, 439 0x3b, 0xc1, 0x03, 0xe1, 0xa1, 0x94, 0xbb, 0xd8 440 ); 441 442 DEFINE_HEX_XDR_NETOBJ(rfc3962_enc_test6_plaintext, 443 0x49, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20, 444 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65, 445 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 446 0x20, 0x47, 0x61, 0x75, 0x27, 0x73, 0x20, 0x43, 447 0x68, 0x69, 0x63, 0x6b, 0x65, 0x6e, 0x2c, 0x20, 448 0x70, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2c, 0x20, 449 0x61, 0x6e, 0x64, 0x20, 0x77, 0x6f, 0x6e, 0x74, 450 0x6f, 0x6e, 0x20, 0x73, 0x6f, 0x75, 0x70, 0x2e 451 ); 452 DEFINE_HEX_XDR_NETOBJ(rfc3962_enc_test6_expected_result, 453 0x97, 0x68, 0x72, 0x68, 0xd6, 0xec, 0xcc, 0xc0, 454 0xc0, 0x7b, 0x25, 0xe2, 0x5e, 0xcf, 0xe5, 0x84, 455 0x39, 0x31, 0x25, 0x23, 0xa7, 0x86, 0x62, 0xd5, 456 0xbe, 0x7f, 0xcb, 0xcc, 0x98, 0xeb, 0xf5, 0xa8, 457 0x48, 0x07, 0xef, 0xe8, 0x36, 0xee, 0x89, 0xa5, 458 0x26, 0x73, 0x0d, 0xbc, 0x2f, 0x7b, 0xc8, 0x40, 459 0x9d, 0xad, 0x8b, 0xbb, 0x96, 0xc4, 0xcd, 0xc0, 460 0x3b, 0xc1, 0x03, 0xe1, 0xa1, 0x94, 0xbb, 0xd8 461 ); 462 DEFINE_HEX_XDR_NETOBJ(rfc3962_enc_test6_next_iv, 463 0x48, 0x07, 0xef, 0xe8, 0x36, 0xee, 0x89, 0xa5, 464 0x26, 0x73, 0x0d, 0xbc, 0x2f, 0x7b, 0xc8, 0x40 465 ); 466 467 static const struct gss_krb5_test_param rfc3962_encrypt_test_params[] = { 468 { 469 .desc = "Encrypt with aes128-cts-hmac-sha1-96 case 1", 470 .enctype = ENCTYPE_AES128_CTS_HMAC_SHA1_96, 471 .Ke = &rfc3962_encryption_key, 472 .plaintext = &rfc3962_enc_test1_plaintext, 473 .expected_result = &rfc3962_enc_test1_expected_result, 474 .next_iv = &rfc3962_enc_test1_next_iv, 475 }, 476 { 477 .desc = "Encrypt with aes128-cts-hmac-sha1-96 case 2", 478 .enctype = ENCTYPE_AES128_CTS_HMAC_SHA1_96, 479 .Ke = &rfc3962_encryption_key, 480 .plaintext = &rfc3962_enc_test2_plaintext, 481 .expected_result = &rfc3962_enc_test2_expected_result, 482 .next_iv = &rfc3962_enc_test2_next_iv, 483 }, 484 { 485 .desc = "Encrypt with aes128-cts-hmac-sha1-96 case 3", 486 .enctype = ENCTYPE_AES128_CTS_HMAC_SHA1_96, 487 .Ke = &rfc3962_encryption_key, 488 .plaintext = &rfc3962_enc_test3_plaintext, 489 .expected_result = &rfc3962_enc_test3_expected_result, 490 .next_iv = &rfc3962_enc_test3_next_iv, 491 }, 492 { 493 .desc = "Encrypt with aes128-cts-hmac-sha1-96 case 4", 494 .enctype = ENCTYPE_AES128_CTS_HMAC_SHA1_96, 495 .Ke = &rfc3962_encryption_key, 496 .plaintext = &rfc3962_enc_test4_plaintext, 497 .expected_result = &rfc3962_enc_test4_expected_result, 498 .next_iv = &rfc3962_enc_test4_next_iv, 499 }, 500 { 501 .desc = "Encrypt with aes128-cts-hmac-sha1-96 case 5", 502 .enctype = ENCTYPE_AES128_CTS_HMAC_SHA1_96, 503 .Ke = &rfc3962_encryption_key, 504 .plaintext = &rfc3962_enc_test5_plaintext, 505 .expected_result = &rfc3962_enc_test5_expected_result, 506 .next_iv = &rfc3962_enc_test5_next_iv, 507 }, 508 { 509 .desc = "Encrypt with aes128-cts-hmac-sha1-96 case 6", 510 .enctype = ENCTYPE_AES128_CTS_HMAC_SHA1_96, 511 .Ke = &rfc3962_encryption_key, 512 .plaintext = &rfc3962_enc_test6_plaintext, 513 .expected_result = &rfc3962_enc_test6_expected_result, 514 .next_iv = &rfc3962_enc_test6_next_iv, 515 }, 516 }; 517 518 /* Creates the function rfc3962_encrypt_gen_params */ 519 KUNIT_ARRAY_PARAM(rfc3962_encrypt, rfc3962_encrypt_test_params, 520 gss_krb5_get_desc); 521 522 /* 523 * This tests the implementation of the encryption part of the mechanism. 524 * It does not apply a confounder or test the result of HMAC over the 525 * plaintext. 526 */ 527 static void rfc3962_encrypt_case(struct kunit *test) 528 { 529 const struct gss_krb5_test_param *param = test->param_value; 530 struct crypto_sync_skcipher *cts_tfm, *cbc_tfm; 531 const struct gss_krb5_enctype *gk5e; 532 struct xdr_buf buf; 533 void *iv, *text; 534 u32 err; 535 536 /* Arrange */ 537 gk5e = gss_krb5_lookup_enctype(param->enctype); 538 if (!gk5e) 539 kunit_skip(test, "Encryption type is not available"); 540 541 cbc_tfm = crypto_alloc_sync_skcipher(gk5e->aux_cipher, 0, 0); 542 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, cbc_tfm); 543 err = crypto_sync_skcipher_setkey(cbc_tfm, param->Ke->data, param->Ke->len); 544 KUNIT_ASSERT_EQ(test, err, 0); 545 546 cts_tfm = crypto_alloc_sync_skcipher(gk5e->encrypt_name, 0, 0); 547 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, cts_tfm); 548 err = crypto_sync_skcipher_setkey(cts_tfm, param->Ke->data, param->Ke->len); 549 KUNIT_ASSERT_EQ(test, err, 0); 550 551 iv = kunit_kzalloc(test, crypto_sync_skcipher_ivsize(cts_tfm), GFP_KERNEL); 552 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, iv); 553 554 text = kunit_kzalloc(test, param->plaintext->len, GFP_KERNEL); 555 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, text); 556 557 memcpy(text, param->plaintext->data, param->plaintext->len); 558 memset(&buf, 0, sizeof(buf)); 559 buf.head[0].iov_base = text; 560 buf.head[0].iov_len = param->plaintext->len; 561 buf.len = buf.head[0].iov_len; 562 563 /* Act */ 564 err = krb5_cbc_cts_encrypt(cts_tfm, cbc_tfm, 0, &buf, NULL, 565 iv, crypto_sync_skcipher_ivsize(cts_tfm)); 566 KUNIT_ASSERT_EQ(test, err, 0); 567 568 /* Assert */ 569 KUNIT_EXPECT_EQ_MSG(test, 570 param->expected_result->len, buf.len, 571 "ciphertext length mismatch"); 572 KUNIT_EXPECT_EQ_MSG(test, 573 memcmp(param->expected_result->data, 574 text, param->expected_result->len), 0, 575 "ciphertext mismatch"); 576 KUNIT_EXPECT_EQ_MSG(test, 577 memcmp(param->next_iv->data, iv, 578 param->next_iv->len), 0, 579 "IV mismatch"); 580 581 crypto_free_sync_skcipher(cts_tfm); 582 crypto_free_sync_skcipher(cbc_tfm); 583 } 584 585 static struct kunit_case rfc3962_test_cases[] = { 586 { 587 .name = "RFC 3962 encryption", 588 .run_case = rfc3962_encrypt_case, 589 .generate_params = rfc3962_encrypt_gen_params, 590 }, 591 {} 592 }; 593 594 static struct kunit_suite rfc3962_suite = { 595 .name = "RFC 3962 suite", 596 .test_cases = rfc3962_test_cases, 597 }; 598 599 /* 600 * From RFC 6803 Section 10. Test vectors 601 * 602 * Sample results for key derivation 603 * 604 * Copyright (c) 2012 IETF Trust and the persons identified as the 605 * document authors. All rights reserved. 606 */ 607 608 DEFINE_HEX_XDR_NETOBJ(camellia128_cts_cmac_basekey, 609 0x57, 0xd0, 0x29, 0x72, 0x98, 0xff, 0xd9, 0xd3, 610 0x5d, 0xe5, 0xa4, 0x7f, 0xb4, 0xbd, 0xe2, 0x4b 611 ); 612 DEFINE_HEX_XDR_NETOBJ(camellia128_cts_cmac_Kc, 613 0xd1, 0x55, 0x77, 0x5a, 0x20, 0x9d, 0x05, 0xf0, 614 0x2b, 0x38, 0xd4, 0x2a, 0x38, 0x9e, 0x5a, 0x56 615 ); 616 DEFINE_HEX_XDR_NETOBJ(camellia128_cts_cmac_Ke, 617 0x64, 0xdf, 0x83, 0xf8, 0x5a, 0x53, 0x2f, 0x17, 618 0x57, 0x7d, 0x8c, 0x37, 0x03, 0x57, 0x96, 0xab 619 ); 620 DEFINE_HEX_XDR_NETOBJ(camellia128_cts_cmac_Ki, 621 0x3e, 0x4f, 0xbd, 0xf3, 0x0f, 0xb8, 0x25, 0x9c, 622 0x42, 0x5c, 0xb6, 0xc9, 0x6f, 0x1f, 0x46, 0x35 623 ); 624 625 DEFINE_HEX_XDR_NETOBJ(camellia256_cts_cmac_basekey, 626 0xb9, 0xd6, 0x82, 0x8b, 0x20, 0x56, 0xb7, 0xbe, 627 0x65, 0x6d, 0x88, 0xa1, 0x23, 0xb1, 0xfa, 0xc6, 628 0x82, 0x14, 0xac, 0x2b, 0x72, 0x7e, 0xcf, 0x5f, 629 0x69, 0xaf, 0xe0, 0xc4, 0xdf, 0x2a, 0x6d, 0x2c 630 ); 631 DEFINE_HEX_XDR_NETOBJ(camellia256_cts_cmac_Kc, 632 0xe4, 0x67, 0xf9, 0xa9, 0x55, 0x2b, 0xc7, 0xd3, 633 0x15, 0x5a, 0x62, 0x20, 0xaf, 0x9c, 0x19, 0x22, 634 0x0e, 0xee, 0xd4, 0xff, 0x78, 0xb0, 0xd1, 0xe6, 635 0xa1, 0x54, 0x49, 0x91, 0x46, 0x1a, 0x9e, 0x50 636 ); 637 DEFINE_HEX_XDR_NETOBJ(camellia256_cts_cmac_Ke, 638 0x41, 0x2a, 0xef, 0xc3, 0x62, 0xa7, 0x28, 0x5f, 639 0xc3, 0x96, 0x6c, 0x6a, 0x51, 0x81, 0xe7, 0x60, 640 0x5a, 0xe6, 0x75, 0x23, 0x5b, 0x6d, 0x54, 0x9f, 641 0xbf, 0xc9, 0xab, 0x66, 0x30, 0xa4, 0xc6, 0x04 642 ); 643 DEFINE_HEX_XDR_NETOBJ(camellia256_cts_cmac_Ki, 644 0xfa, 0x62, 0x4f, 0xa0, 0xe5, 0x23, 0x99, 0x3f, 645 0xa3, 0x88, 0xae, 0xfd, 0xc6, 0x7e, 0x67, 0xeb, 646 0xcd, 0x8c, 0x08, 0xe8, 0xa0, 0x24, 0x6b, 0x1d, 647 0x73, 0xb0, 0xd1, 0xdd, 0x9f, 0xc5, 0x82, 0xb0 648 ); 649 650 DEFINE_HEX_XDR_NETOBJ(usage_checksum, 651 0x00, 0x00, 0x00, 0x02, KEY_USAGE_SEED_CHECKSUM 652 ); 653 DEFINE_HEX_XDR_NETOBJ(usage_encryption, 654 0x00, 0x00, 0x00, 0x02, KEY_USAGE_SEED_ENCRYPTION 655 ); 656 DEFINE_HEX_XDR_NETOBJ(usage_integrity, 657 0x00, 0x00, 0x00, 0x02, KEY_USAGE_SEED_INTEGRITY 658 ); 659 660 static const struct gss_krb5_test_param rfc6803_kdf_test_params[] = { 661 { 662 .desc = "Derive Kc subkey for camellia128-cts-cmac", 663 .enctype = ENCTYPE_CAMELLIA128_CTS_CMAC, 664 .base_key = &camellia128_cts_cmac_basekey, 665 .usage = &usage_checksum, 666 .expected_result = &camellia128_cts_cmac_Kc, 667 }, 668 { 669 .desc = "Derive Ke subkey for camellia128-cts-cmac", 670 .enctype = ENCTYPE_CAMELLIA128_CTS_CMAC, 671 .base_key = &camellia128_cts_cmac_basekey, 672 .usage = &usage_encryption, 673 .expected_result = &camellia128_cts_cmac_Ke, 674 }, 675 { 676 .desc = "Derive Ki subkey for camellia128-cts-cmac", 677 .enctype = ENCTYPE_CAMELLIA128_CTS_CMAC, 678 .base_key = &camellia128_cts_cmac_basekey, 679 .usage = &usage_integrity, 680 .expected_result = &camellia128_cts_cmac_Ki, 681 }, 682 { 683 .desc = "Derive Kc subkey for camellia256-cts-cmac", 684 .enctype = ENCTYPE_CAMELLIA256_CTS_CMAC, 685 .base_key = &camellia256_cts_cmac_basekey, 686 .usage = &usage_checksum, 687 .expected_result = &camellia256_cts_cmac_Kc, 688 }, 689 { 690 .desc = "Derive Ke subkey for camellia256-cts-cmac", 691 .enctype = ENCTYPE_CAMELLIA256_CTS_CMAC, 692 .base_key = &camellia256_cts_cmac_basekey, 693 .usage = &usage_encryption, 694 .expected_result = &camellia256_cts_cmac_Ke, 695 }, 696 { 697 .desc = "Derive Ki subkey for camellia256-cts-cmac", 698 .enctype = ENCTYPE_CAMELLIA256_CTS_CMAC, 699 .base_key = &camellia256_cts_cmac_basekey, 700 .usage = &usage_integrity, 701 .expected_result = &camellia256_cts_cmac_Ki, 702 }, 703 }; 704 705 /* Creates the function rfc6803_kdf_gen_params */ 706 KUNIT_ARRAY_PARAM(rfc6803_kdf, rfc6803_kdf_test_params, gss_krb5_get_desc); 707 708 /* 709 * From RFC 6803 Section 10. Test vectors 710 * 711 * Sample checksums. 712 * 713 * Copyright (c) 2012 IETF Trust and the persons identified as the 714 * document authors. All rights reserved. 715 * 716 * XXX: These tests are likely to fail on EBCDIC or Unicode platforms. 717 */ 718 DEFINE_STR_XDR_NETOBJ(rfc6803_checksum_test1_plaintext, 719 "abcdefghijk"); 720 DEFINE_HEX_XDR_NETOBJ(rfc6803_checksum_test1_basekey, 721 0x1d, 0xc4, 0x6a, 0x8d, 0x76, 0x3f, 0x4f, 0x93, 722 0x74, 0x2b, 0xcb, 0xa3, 0x38, 0x75, 0x76, 0xc3 723 ); 724 DEFINE_HEX_XDR_NETOBJ(rfc6803_checksum_test1_usage, 725 0x00, 0x00, 0x00, 0x07, KEY_USAGE_SEED_CHECKSUM 726 ); 727 DEFINE_HEX_XDR_NETOBJ(rfc6803_checksum_test1_expected_result, 728 0x11, 0x78, 0xe6, 0xc5, 0xc4, 0x7a, 0x8c, 0x1a, 729 0xe0, 0xc4, 0xb9, 0xc7, 0xd4, 0xeb, 0x7b, 0x6b 730 ); 731 732 DEFINE_STR_XDR_NETOBJ(rfc6803_checksum_test2_plaintext, 733 "ABCDEFGHIJKLMNOPQRSTUVWXYZ"); 734 DEFINE_HEX_XDR_NETOBJ(rfc6803_checksum_test2_basekey, 735 0x50, 0x27, 0xbc, 0x23, 0x1d, 0x0f, 0x3a, 0x9d, 736 0x23, 0x33, 0x3f, 0x1c, 0xa6, 0xfd, 0xbe, 0x7c 737 ); 738 DEFINE_HEX_XDR_NETOBJ(rfc6803_checksum_test2_usage, 739 0x00, 0x00, 0x00, 0x08, KEY_USAGE_SEED_CHECKSUM 740 ); 741 DEFINE_HEX_XDR_NETOBJ(rfc6803_checksum_test2_expected_result, 742 0xd1, 0xb3, 0x4f, 0x70, 0x04, 0xa7, 0x31, 0xf2, 743 0x3a, 0x0c, 0x00, 0xbf, 0x6c, 0x3f, 0x75, 0x3a 744 ); 745 746 DEFINE_STR_XDR_NETOBJ(rfc6803_checksum_test3_plaintext, 747 "123456789"); 748 DEFINE_HEX_XDR_NETOBJ(rfc6803_checksum_test3_basekey, 749 0xb6, 0x1c, 0x86, 0xcc, 0x4e, 0x5d, 0x27, 0x57, 750 0x54, 0x5a, 0xd4, 0x23, 0x39, 0x9f, 0xb7, 0x03, 751 0x1e, 0xca, 0xb9, 0x13, 0xcb, 0xb9, 0x00, 0xbd, 752 0x7a, 0x3c, 0x6d, 0xd8, 0xbf, 0x92, 0x01, 0x5b 753 ); 754 DEFINE_HEX_XDR_NETOBJ(rfc6803_checksum_test3_usage, 755 0x00, 0x00, 0x00, 0x09, KEY_USAGE_SEED_CHECKSUM 756 ); 757 DEFINE_HEX_XDR_NETOBJ(rfc6803_checksum_test3_expected_result, 758 0x87, 0xa1, 0x2c, 0xfd, 0x2b, 0x96, 0x21, 0x48, 759 0x10, 0xf0, 0x1c, 0x82, 0x6e, 0x77, 0x44, 0xb1 760 ); 761 762 DEFINE_STR_XDR_NETOBJ(rfc6803_checksum_test4_plaintext, 763 "!@#$%^&*()!@#$%^&*()!@#$%^&*()"); 764 DEFINE_HEX_XDR_NETOBJ(rfc6803_checksum_test4_basekey, 765 0x32, 0x16, 0x4c, 0x5b, 0x43, 0x4d, 0x1d, 0x15, 766 0x38, 0xe4, 0xcf, 0xd9, 0xbe, 0x80, 0x40, 0xfe, 767 0x8c, 0x4a, 0xc7, 0xac, 0xc4, 0xb9, 0x3d, 0x33, 768 0x14, 0xd2, 0x13, 0x36, 0x68, 0x14, 0x7a, 0x05 769 ); 770 DEFINE_HEX_XDR_NETOBJ(rfc6803_checksum_test4_usage, 771 0x00, 0x00, 0x00, 0x0a, KEY_USAGE_SEED_CHECKSUM 772 ); 773 DEFINE_HEX_XDR_NETOBJ(rfc6803_checksum_test4_expected_result, 774 0x3f, 0xa0, 0xb4, 0x23, 0x55, 0xe5, 0x2b, 0x18, 775 0x91, 0x87, 0x29, 0x4a, 0xa2, 0x52, 0xab, 0x64 776 ); 777 778 static const struct gss_krb5_test_param rfc6803_checksum_test_params[] = { 779 { 780 .desc = "camellia128-cts-cmac checksum test 1", 781 .enctype = ENCTYPE_CAMELLIA128_CTS_CMAC, 782 .base_key = &rfc6803_checksum_test1_basekey, 783 .usage = &rfc6803_checksum_test1_usage, 784 .plaintext = &rfc6803_checksum_test1_plaintext, 785 .expected_result = &rfc6803_checksum_test1_expected_result, 786 }, 787 { 788 .desc = "camellia128-cts-cmac checksum test 2", 789 .enctype = ENCTYPE_CAMELLIA128_CTS_CMAC, 790 .base_key = &rfc6803_checksum_test2_basekey, 791 .usage = &rfc6803_checksum_test2_usage, 792 .plaintext = &rfc6803_checksum_test2_plaintext, 793 .expected_result = &rfc6803_checksum_test2_expected_result, 794 }, 795 { 796 .desc = "camellia256-cts-cmac checksum test 3", 797 .enctype = ENCTYPE_CAMELLIA256_CTS_CMAC, 798 .base_key = &rfc6803_checksum_test3_basekey, 799 .usage = &rfc6803_checksum_test3_usage, 800 .plaintext = &rfc6803_checksum_test3_plaintext, 801 .expected_result = &rfc6803_checksum_test3_expected_result, 802 }, 803 { 804 .desc = "camellia256-cts-cmac checksum test 4", 805 .enctype = ENCTYPE_CAMELLIA256_CTS_CMAC, 806 .base_key = &rfc6803_checksum_test4_basekey, 807 .usage = &rfc6803_checksum_test4_usage, 808 .plaintext = &rfc6803_checksum_test4_plaintext, 809 .expected_result = &rfc6803_checksum_test4_expected_result, 810 }, 811 }; 812 813 /* Creates the function rfc6803_checksum_gen_params */ 814 KUNIT_ARRAY_PARAM(rfc6803_checksum, rfc6803_checksum_test_params, 815 gss_krb5_get_desc); 816 817 /* 818 * From RFC 6803 Section 10. Test vectors 819 * 820 * Sample encryptions (all using the default cipher state) 821 * 822 * Copyright (c) 2012 IETF Trust and the persons identified as the 823 * document authors. All rights reserved. 824 * 825 * Key usage values are from errata 4326 against RFC 6803. 826 */ 827 828 static const struct xdr_netobj rfc6803_enc_empty_plaintext = { 829 .len = 0, 830 }; 831 832 DEFINE_STR_XDR_NETOBJ(rfc6803_enc_1byte_plaintext, "1"); 833 DEFINE_STR_XDR_NETOBJ(rfc6803_enc_9byte_plaintext, "9 bytesss"); 834 DEFINE_STR_XDR_NETOBJ(rfc6803_enc_13byte_plaintext, "13 bytes byte"); 835 DEFINE_STR_XDR_NETOBJ(rfc6803_enc_30byte_plaintext, 836 "30 bytes bytes bytes bytes byt" 837 ); 838 839 DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test1_confounder, 840 0xb6, 0x98, 0x22, 0xa1, 0x9a, 0x6b, 0x09, 0xc0, 841 0xeb, 0xc8, 0x55, 0x7d, 0x1f, 0x1b, 0x6c, 0x0a 842 ); 843 DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test1_basekey, 844 0x1d, 0xc4, 0x6a, 0x8d, 0x76, 0x3f, 0x4f, 0x93, 845 0x74, 0x2b, 0xcb, 0xa3, 0x38, 0x75, 0x76, 0xc3 846 ); 847 DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test1_expected_result, 848 0xc4, 0x66, 0xf1, 0x87, 0x10, 0x69, 0x92, 0x1e, 849 0xdb, 0x7c, 0x6f, 0xde, 0x24, 0x4a, 0x52, 0xdb, 850 0x0b, 0xa1, 0x0e, 0xdc, 0x19, 0x7b, 0xdb, 0x80, 851 0x06, 0x65, 0x8c, 0xa3, 0xcc, 0xce, 0x6e, 0xb8 852 ); 853 854 DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test2_confounder, 855 0x6f, 0x2f, 0xc3, 0xc2, 0xa1, 0x66, 0xfd, 0x88, 856 0x98, 0x96, 0x7a, 0x83, 0xde, 0x95, 0x96, 0xd9 857 ); 858 DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test2_basekey, 859 0x50, 0x27, 0xbc, 0x23, 0x1d, 0x0f, 0x3a, 0x9d, 860 0x23, 0x33, 0x3f, 0x1c, 0xa6, 0xfd, 0xbe, 0x7c 861 ); 862 DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test2_expected_result, 863 0x84, 0x2d, 0x21, 0xfd, 0x95, 0x03, 0x11, 0xc0, 864 0xdd, 0x46, 0x4a, 0x3f, 0x4b, 0xe8, 0xd6, 0xda, 865 0x88, 0xa5, 0x6d, 0x55, 0x9c, 0x9b, 0x47, 0xd3, 866 0xf9, 0xa8, 0x50, 0x67, 0xaf, 0x66, 0x15, 0x59, 867 0xb8 868 ); 869 870 DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test3_confounder, 871 0xa5, 0xb4, 0xa7, 0x1e, 0x07, 0x7a, 0xee, 0xf9, 872 0x3c, 0x87, 0x63, 0xc1, 0x8f, 0xdb, 0x1f, 0x10 873 ); 874 DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test3_basekey, 875 0xa1, 0xbb, 0x61, 0xe8, 0x05, 0xf9, 0xba, 0x6d, 876 0xde, 0x8f, 0xdb, 0xdd, 0xc0, 0x5c, 0xde, 0xa0 877 ); 878 DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test3_expected_result, 879 0x61, 0x9f, 0xf0, 0x72, 0xe3, 0x62, 0x86, 0xff, 880 0x0a, 0x28, 0xde, 0xb3, 0xa3, 0x52, 0xec, 0x0d, 881 0x0e, 0xdf, 0x5c, 0x51, 0x60, 0xd6, 0x63, 0xc9, 882 0x01, 0x75, 0x8c, 0xcf, 0x9d, 0x1e, 0xd3, 0x3d, 883 0x71, 0xdb, 0x8f, 0x23, 0xaa, 0xbf, 0x83, 0x48, 884 0xa0 885 ); 886 887 DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test4_confounder, 888 0x19, 0xfe, 0xe4, 0x0d, 0x81, 0x0c, 0x52, 0x4b, 889 0x5b, 0x22, 0xf0, 0x18, 0x74, 0xc6, 0x93, 0xda 890 ); 891 DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test4_basekey, 892 0x2c, 0xa2, 0x7a, 0x5f, 0xaf, 0x55, 0x32, 0x24, 893 0x45, 0x06, 0x43, 0x4e, 0x1c, 0xef, 0x66, 0x76 894 ); 895 DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test4_expected_result, 896 0xb8, 0xec, 0xa3, 0x16, 0x7a, 0xe6, 0x31, 0x55, 897 0x12, 0xe5, 0x9f, 0x98, 0xa7, 0xc5, 0x00, 0x20, 898 0x5e, 0x5f, 0x63, 0xff, 0x3b, 0xb3, 0x89, 0xaf, 899 0x1c, 0x41, 0xa2, 0x1d, 0x64, 0x0d, 0x86, 0x15, 900 0xc9, 0xed, 0x3f, 0xbe, 0xb0, 0x5a, 0xb6, 0xac, 901 0xb6, 0x76, 0x89, 0xb5, 0xea 902 ); 903 904 DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test5_confounder, 905 0xca, 0x7a, 0x7a, 0xb4, 0xbe, 0x19, 0x2d, 0xab, 906 0xd6, 0x03, 0x50, 0x6d, 0xb1, 0x9c, 0x39, 0xe2 907 ); 908 DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test5_basekey, 909 0x78, 0x24, 0xf8, 0xc1, 0x6f, 0x83, 0xff, 0x35, 910 0x4c, 0x6b, 0xf7, 0x51, 0x5b, 0x97, 0x3f, 0x43 911 ); 912 DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test5_expected_result, 913 0xa2, 0x6a, 0x39, 0x05, 0xa4, 0xff, 0xd5, 0x81, 914 0x6b, 0x7b, 0x1e, 0x27, 0x38, 0x0d, 0x08, 0x09, 915 0x0c, 0x8e, 0xc1, 0xf3, 0x04, 0x49, 0x6e, 0x1a, 916 0xbd, 0xcd, 0x2b, 0xdc, 0xd1, 0xdf, 0xfc, 0x66, 917 0x09, 0x89, 0xe1, 0x17, 0xa7, 0x13, 0xdd, 0xbb, 918 0x57, 0xa4, 0x14, 0x6c, 0x15, 0x87, 0xcb, 0xa4, 919 0x35, 0x66, 0x65, 0x59, 0x1d, 0x22, 0x40, 0x28, 920 0x2f, 0x58, 0x42, 0xb1, 0x05, 0xa5 921 ); 922 923 DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test6_confounder, 924 0x3c, 0xbb, 0xd2, 0xb4, 0x59, 0x17, 0x94, 0x10, 925 0x67, 0xf9, 0x65, 0x99, 0xbb, 0x98, 0x92, 0x6c 926 ); 927 DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test6_basekey, 928 0xb6, 0x1c, 0x86, 0xcc, 0x4e, 0x5d, 0x27, 0x57, 929 0x54, 0x5a, 0xd4, 0x23, 0x39, 0x9f, 0xb7, 0x03, 930 0x1e, 0xca, 0xb9, 0x13, 0xcb, 0xb9, 0x00, 0xbd, 931 0x7a, 0x3c, 0x6d, 0xd8, 0xbf, 0x92, 0x01, 0x5b 932 ); 933 DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test6_expected_result, 934 0x03, 0x88, 0x6d, 0x03, 0x31, 0x0b, 0x47, 0xa6, 935 0xd8, 0xf0, 0x6d, 0x7b, 0x94, 0xd1, 0xdd, 0x83, 936 0x7e, 0xcc, 0xe3, 0x15, 0xef, 0x65, 0x2a, 0xff, 937 0x62, 0x08, 0x59, 0xd9, 0x4a, 0x25, 0x92, 0x66 938 ); 939 940 DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test7_confounder, 941 0xde, 0xf4, 0x87, 0xfc, 0xeb, 0xe6, 0xde, 0x63, 942 0x46, 0xd4, 0xda, 0x45, 0x21, 0xbb, 0xa2, 0xd2 943 ); 944 DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test7_basekey, 945 0x1b, 0x97, 0xfe, 0x0a, 0x19, 0x0e, 0x20, 0x21, 946 0xeb, 0x30, 0x75, 0x3e, 0x1b, 0x6e, 0x1e, 0x77, 947 0xb0, 0x75, 0x4b, 0x1d, 0x68, 0x46, 0x10, 0x35, 948 0x58, 0x64, 0x10, 0x49, 0x63, 0x46, 0x38, 0x33 949 ); 950 DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test7_expected_result, 951 0x2c, 0x9c, 0x15, 0x70, 0x13, 0x3c, 0x99, 0xbf, 952 0x6a, 0x34, 0xbc, 0x1b, 0x02, 0x12, 0x00, 0x2f, 953 0xd1, 0x94, 0x33, 0x87, 0x49, 0xdb, 0x41, 0x35, 954 0x49, 0x7a, 0x34, 0x7c, 0xfc, 0xd9, 0xd1, 0x8a, 955 0x12 956 ); 957 958 DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test8_confounder, 959 0xad, 0x4f, 0xf9, 0x04, 0xd3, 0x4e, 0x55, 0x53, 960 0x84, 0xb1, 0x41, 0x00, 0xfc, 0x46, 0x5f, 0x88 961 ); 962 DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test8_basekey, 963 0x32, 0x16, 0x4c, 0x5b, 0x43, 0x4d, 0x1d, 0x15, 964 0x38, 0xe4, 0xcf, 0xd9, 0xbe, 0x80, 0x40, 0xfe, 965 0x8c, 0x4a, 0xc7, 0xac, 0xc4, 0xb9, 0x3d, 0x33, 966 0x14, 0xd2, 0x13, 0x36, 0x68, 0x14, 0x7a, 0x05 967 ); 968 DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test8_expected_result, 969 0x9c, 0x6d, 0xe7, 0x5f, 0x81, 0x2d, 0xe7, 0xed, 970 0x0d, 0x28, 0xb2, 0x96, 0x35, 0x57, 0xa1, 0x15, 971 0x64, 0x09, 0x98, 0x27, 0x5b, 0x0a, 0xf5, 0x15, 972 0x27, 0x09, 0x91, 0x3f, 0xf5, 0x2a, 0x2a, 0x9c, 973 0x8e, 0x63, 0xb8, 0x72, 0xf9, 0x2e, 0x64, 0xc8, 974 0x39 975 ); 976 977 DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test9_confounder, 978 0xcf, 0x9b, 0xca, 0x6d, 0xf1, 0x14, 0x4e, 0x0c, 979 0x0a, 0xf9, 0xb8, 0xf3, 0x4c, 0x90, 0xd5, 0x14 980 ); 981 DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test9_basekey, 982 0xb0, 0x38, 0xb1, 0x32, 0xcd, 0x8e, 0x06, 0x61, 983 0x22, 0x67, 0xfa, 0xb7, 0x17, 0x00, 0x66, 0xd8, 984 0x8a, 0xec, 0xcb, 0xa0, 0xb7, 0x44, 0xbf, 0xc6, 985 0x0d, 0xc8, 0x9b, 0xca, 0x18, 0x2d, 0x07, 0x15 986 ); 987 DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test9_expected_result, 988 0xee, 0xec, 0x85, 0xa9, 0x81, 0x3c, 0xdc, 0x53, 989 0x67, 0x72, 0xab, 0x9b, 0x42, 0xde, 0xfc, 0x57, 990 0x06, 0xf7, 0x26, 0xe9, 0x75, 0xdd, 0xe0, 0x5a, 991 0x87, 0xeb, 0x54, 0x06, 0xea, 0x32, 0x4c, 0xa1, 992 0x85, 0xc9, 0x98, 0x6b, 0x42, 0xaa, 0xbe, 0x79, 993 0x4b, 0x84, 0x82, 0x1b, 0xee 994 ); 995 996 DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test10_confounder, 997 0x64, 0x4d, 0xef, 0x38, 0xda, 0x35, 0x00, 0x72, 998 0x75, 0x87, 0x8d, 0x21, 0x68, 0x55, 0xe2, 0x28 999 ); 1000 DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test10_basekey, 1001 0xcc, 0xfc, 0xd3, 0x49, 0xbf, 0x4c, 0x66, 0x77, 1002 0xe8, 0x6e, 0x4b, 0x02, 0xb8, 0xea, 0xb9, 0x24, 1003 0xa5, 0x46, 0xac, 0x73, 0x1c, 0xf9, 0xbf, 0x69, 1004 0x89, 0xb9, 0x96, 0xe7, 0xd6, 0xbf, 0xbb, 0xa7 1005 ); 1006 DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test10_expected_result, 1007 0x0e, 0x44, 0x68, 0x09, 0x85, 0x85, 0x5f, 0x2d, 1008 0x1f, 0x18, 0x12, 0x52, 0x9c, 0xa8, 0x3b, 0xfd, 1009 0x8e, 0x34, 0x9d, 0xe6, 0xfd, 0x9a, 0xda, 0x0b, 1010 0xaa, 0xa0, 0x48, 0xd6, 0x8e, 0x26, 0x5f, 0xeb, 1011 0xf3, 0x4a, 0xd1, 0x25, 0x5a, 0x34, 0x49, 0x99, 1012 0xad, 0x37, 0x14, 0x68, 0x87, 0xa6, 0xc6, 0x84, 1013 0x57, 0x31, 0xac, 0x7f, 0x46, 0x37, 0x6a, 0x05, 1014 0x04, 0xcd, 0x06, 0x57, 0x14, 0x74 1015 ); 1016 1017 static const struct gss_krb5_test_param rfc6803_encrypt_test_params[] = { 1018 { 1019 .desc = "Encrypt empty plaintext with camellia128-cts-cmac", 1020 .enctype = ENCTYPE_CAMELLIA128_CTS_CMAC, 1021 .constant = 0, 1022 .base_key = &rfc6803_enc_test1_basekey, 1023 .plaintext = &rfc6803_enc_empty_plaintext, 1024 .confounder = &rfc6803_enc_test1_confounder, 1025 .expected_result = &rfc6803_enc_test1_expected_result, 1026 }, 1027 { 1028 .desc = "Encrypt 1 byte with camellia128-cts-cmac", 1029 .enctype = ENCTYPE_CAMELLIA128_CTS_CMAC, 1030 .constant = 1, 1031 .base_key = &rfc6803_enc_test2_basekey, 1032 .plaintext = &rfc6803_enc_1byte_plaintext, 1033 .confounder = &rfc6803_enc_test2_confounder, 1034 .expected_result = &rfc6803_enc_test2_expected_result, 1035 }, 1036 { 1037 .desc = "Encrypt 9 bytes with camellia128-cts-cmac", 1038 .enctype = ENCTYPE_CAMELLIA128_CTS_CMAC, 1039 .constant = 2, 1040 .base_key = &rfc6803_enc_test3_basekey, 1041 .plaintext = &rfc6803_enc_9byte_plaintext, 1042 .confounder = &rfc6803_enc_test3_confounder, 1043 .expected_result = &rfc6803_enc_test3_expected_result, 1044 }, 1045 { 1046 .desc = "Encrypt 13 bytes with camellia128-cts-cmac", 1047 .enctype = ENCTYPE_CAMELLIA128_CTS_CMAC, 1048 .constant = 3, 1049 .base_key = &rfc6803_enc_test4_basekey, 1050 .plaintext = &rfc6803_enc_13byte_plaintext, 1051 .confounder = &rfc6803_enc_test4_confounder, 1052 .expected_result = &rfc6803_enc_test4_expected_result, 1053 }, 1054 { 1055 .desc = "Encrypt 30 bytes with camellia128-cts-cmac", 1056 .enctype = ENCTYPE_CAMELLIA128_CTS_CMAC, 1057 .constant = 4, 1058 .base_key = &rfc6803_enc_test5_basekey, 1059 .plaintext = &rfc6803_enc_30byte_plaintext, 1060 .confounder = &rfc6803_enc_test5_confounder, 1061 .expected_result = &rfc6803_enc_test5_expected_result, 1062 }, 1063 { 1064 .desc = "Encrypt empty plaintext with camellia256-cts-cmac", 1065 .enctype = ENCTYPE_CAMELLIA256_CTS_CMAC, 1066 .constant = 0, 1067 .base_key = &rfc6803_enc_test6_basekey, 1068 .plaintext = &rfc6803_enc_empty_plaintext, 1069 .confounder = &rfc6803_enc_test6_confounder, 1070 .expected_result = &rfc6803_enc_test6_expected_result, 1071 }, 1072 { 1073 .desc = "Encrypt 1 byte with camellia256-cts-cmac", 1074 .enctype = ENCTYPE_CAMELLIA256_CTS_CMAC, 1075 .constant = 1, 1076 .base_key = &rfc6803_enc_test7_basekey, 1077 .plaintext = &rfc6803_enc_1byte_plaintext, 1078 .confounder = &rfc6803_enc_test7_confounder, 1079 .expected_result = &rfc6803_enc_test7_expected_result, 1080 }, 1081 { 1082 .desc = "Encrypt 9 bytes with camellia256-cts-cmac", 1083 .enctype = ENCTYPE_CAMELLIA256_CTS_CMAC, 1084 .constant = 2, 1085 .base_key = &rfc6803_enc_test8_basekey, 1086 .plaintext = &rfc6803_enc_9byte_plaintext, 1087 .confounder = &rfc6803_enc_test8_confounder, 1088 .expected_result = &rfc6803_enc_test8_expected_result, 1089 }, 1090 { 1091 .desc = "Encrypt 13 bytes with camellia256-cts-cmac", 1092 .enctype = ENCTYPE_CAMELLIA256_CTS_CMAC, 1093 .constant = 3, 1094 .base_key = &rfc6803_enc_test9_basekey, 1095 .plaintext = &rfc6803_enc_13byte_plaintext, 1096 .confounder = &rfc6803_enc_test9_confounder, 1097 .expected_result = &rfc6803_enc_test9_expected_result, 1098 }, 1099 { 1100 .desc = "Encrypt 30 bytes with camellia256-cts-cmac", 1101 .enctype = ENCTYPE_CAMELLIA256_CTS_CMAC, 1102 .constant = 4, 1103 .base_key = &rfc6803_enc_test10_basekey, 1104 .plaintext = &rfc6803_enc_30byte_plaintext, 1105 .confounder = &rfc6803_enc_test10_confounder, 1106 .expected_result = &rfc6803_enc_test10_expected_result, 1107 }, 1108 }; 1109 1110 /* Creates the function rfc6803_encrypt_gen_params */ 1111 KUNIT_ARRAY_PARAM(rfc6803_encrypt, rfc6803_encrypt_test_params, 1112 gss_krb5_get_desc); 1113 1114 static void rfc6803_encrypt_case(struct kunit *test) 1115 { 1116 const struct gss_krb5_test_param *param = test->param_value; 1117 struct crypto_sync_skcipher *cts_tfm, *cbc_tfm; 1118 const struct gss_krb5_enctype *gk5e; 1119 struct xdr_netobj Ke, Ki, checksum; 1120 u8 usage_data[GSS_KRB5_K5CLENGTH]; 1121 struct xdr_netobj usage = { 1122 .data = usage_data, 1123 .len = sizeof(usage_data), 1124 }; 1125 struct crypto_ahash *ahash_tfm; 1126 unsigned int blocksize; 1127 struct xdr_buf buf; 1128 void *text; 1129 size_t len; 1130 u32 err; 1131 1132 /* Arrange */ 1133 gk5e = gss_krb5_lookup_enctype(param->enctype); 1134 if (!gk5e) 1135 kunit_skip(test, "Encryption type is not available"); 1136 1137 memset(usage_data, 0, sizeof(usage_data)); 1138 usage.data[3] = param->constant; 1139 1140 Ke.len = gk5e->Ke_length; 1141 Ke.data = kunit_kzalloc(test, Ke.len, GFP_KERNEL); 1142 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, Ke.data); 1143 usage.data[4] = KEY_USAGE_SEED_ENCRYPTION; 1144 err = gk5e->derive_key(gk5e, param->base_key, &Ke, &usage, GFP_KERNEL); 1145 KUNIT_ASSERT_EQ(test, err, 0); 1146 1147 cbc_tfm = crypto_alloc_sync_skcipher(gk5e->aux_cipher, 0, 0); 1148 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, cbc_tfm); 1149 err = crypto_sync_skcipher_setkey(cbc_tfm, Ke.data, Ke.len); 1150 KUNIT_ASSERT_EQ(test, err, 0); 1151 1152 cts_tfm = crypto_alloc_sync_skcipher(gk5e->encrypt_name, 0, 0); 1153 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, cts_tfm); 1154 err = crypto_sync_skcipher_setkey(cts_tfm, Ke.data, Ke.len); 1155 KUNIT_ASSERT_EQ(test, err, 0); 1156 blocksize = crypto_sync_skcipher_blocksize(cts_tfm); 1157 1158 len = param->confounder->len + param->plaintext->len + blocksize; 1159 text = kunit_kzalloc(test, len, GFP_KERNEL); 1160 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, text); 1161 memcpy(text, param->confounder->data, param->confounder->len); 1162 memcpy(text + param->confounder->len, param->plaintext->data, 1163 param->plaintext->len); 1164 1165 memset(&buf, 0, sizeof(buf)); 1166 buf.head[0].iov_base = text; 1167 buf.head[0].iov_len = param->confounder->len + param->plaintext->len; 1168 buf.len = buf.head[0].iov_len; 1169 1170 checksum.len = gk5e->cksumlength; 1171 checksum.data = kunit_kzalloc(test, checksum.len, GFP_KERNEL); 1172 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, checksum.data); 1173 1174 Ki.len = gk5e->Ki_length; 1175 Ki.data = kunit_kzalloc(test, Ki.len, GFP_KERNEL); 1176 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, Ki.data); 1177 usage.data[4] = KEY_USAGE_SEED_INTEGRITY; 1178 err = gk5e->derive_key(gk5e, param->base_key, &Ki, 1179 &usage, GFP_KERNEL); 1180 KUNIT_ASSERT_EQ(test, err, 0); 1181 ahash_tfm = crypto_alloc_ahash(gk5e->cksum_name, 0, CRYPTO_ALG_ASYNC); 1182 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ahash_tfm); 1183 err = crypto_ahash_setkey(ahash_tfm, Ki.data, Ki.len); 1184 KUNIT_ASSERT_EQ(test, err, 0); 1185 1186 /* Act */ 1187 err = gss_krb5_checksum(ahash_tfm, NULL, 0, &buf, 0, &checksum); 1188 KUNIT_ASSERT_EQ(test, err, 0); 1189 1190 err = krb5_cbc_cts_encrypt(cts_tfm, cbc_tfm, 0, &buf, NULL, NULL, 0); 1191 KUNIT_ASSERT_EQ(test, err, 0); 1192 1193 /* Assert */ 1194 KUNIT_EXPECT_EQ_MSG(test, param->expected_result->len, 1195 buf.len + checksum.len, 1196 "ciphertext length mismatch"); 1197 KUNIT_EXPECT_EQ_MSG(test, 1198 memcmp(param->expected_result->data, 1199 buf.head[0].iov_base, buf.len), 0, 1200 "encrypted result mismatch"); 1201 KUNIT_EXPECT_EQ_MSG(test, 1202 memcmp(param->expected_result->data + 1203 (param->expected_result->len - checksum.len), 1204 checksum.data, checksum.len), 0, 1205 "HMAC mismatch"); 1206 1207 crypto_free_ahash(ahash_tfm); 1208 crypto_free_sync_skcipher(cts_tfm); 1209 crypto_free_sync_skcipher(cbc_tfm); 1210 } 1211 1212 static struct kunit_case rfc6803_test_cases[] = { 1213 { 1214 .name = "RFC 6803 key derivation", 1215 .run_case = kdf_case, 1216 .generate_params = rfc6803_kdf_gen_params, 1217 }, 1218 { 1219 .name = "RFC 6803 checksum", 1220 .run_case = checksum_case, 1221 .generate_params = rfc6803_checksum_gen_params, 1222 }, 1223 { 1224 .name = "RFC 6803 encryption", 1225 .run_case = rfc6803_encrypt_case, 1226 .generate_params = rfc6803_encrypt_gen_params, 1227 }, 1228 {} 1229 }; 1230 1231 static struct kunit_suite rfc6803_suite = { 1232 .name = "RFC 6803 suite", 1233 .test_cases = rfc6803_test_cases, 1234 }; 1235 1236 /* 1237 * From RFC 8009 Appendix A. Test Vectors 1238 * 1239 * Sample results for SHA-2 enctype key derivation 1240 * 1241 * This test material is copyright (c) 2016 IETF Trust and the 1242 * persons identified as the document authors. All rights reserved. 1243 */ 1244 1245 DEFINE_HEX_XDR_NETOBJ(aes128_cts_hmac_sha256_128_basekey, 1246 0x37, 0x05, 0xd9, 0x60, 0x80, 0xc1, 0x77, 0x28, 1247 0xa0, 0xe8, 0x00, 0xea, 0xb6, 0xe0, 0xd2, 0x3c 1248 ); 1249 DEFINE_HEX_XDR_NETOBJ(aes128_cts_hmac_sha256_128_Kc, 1250 0xb3, 0x1a, 0x01, 0x8a, 0x48, 0xf5, 0x47, 0x76, 1251 0xf4, 0x03, 0xe9, 0xa3, 0x96, 0x32, 0x5d, 0xc3 1252 ); 1253 DEFINE_HEX_XDR_NETOBJ(aes128_cts_hmac_sha256_128_Ke, 1254 0x9b, 0x19, 0x7d, 0xd1, 0xe8, 0xc5, 0x60, 0x9d, 1255 0x6e, 0x67, 0xc3, 0xe3, 0x7c, 0x62, 0xc7, 0x2e 1256 ); 1257 DEFINE_HEX_XDR_NETOBJ(aes128_cts_hmac_sha256_128_Ki, 1258 0x9f, 0xda, 0x0e, 0x56, 0xab, 0x2d, 0x85, 0xe1, 1259 0x56, 0x9a, 0x68, 0x86, 0x96, 0xc2, 0x6a, 0x6c 1260 ); 1261 1262 DEFINE_HEX_XDR_NETOBJ(aes256_cts_hmac_sha384_192_basekey, 1263 0x6d, 0x40, 0x4d, 0x37, 0xfa, 0xf7, 0x9f, 0x9d, 1264 0xf0, 0xd3, 0x35, 0x68, 0xd3, 0x20, 0x66, 0x98, 1265 0x00, 0xeb, 0x48, 0x36, 0x47, 0x2e, 0xa8, 0xa0, 1266 0x26, 0xd1, 0x6b, 0x71, 0x82, 0x46, 0x0c, 0x52 1267 ); 1268 DEFINE_HEX_XDR_NETOBJ(aes256_cts_hmac_sha384_192_Kc, 1269 0xef, 0x57, 0x18, 0xbe, 0x86, 0xcc, 0x84, 0x96, 1270 0x3d, 0x8b, 0xbb, 0x50, 0x31, 0xe9, 0xf5, 0xc4, 1271 0xba, 0x41, 0xf2, 0x8f, 0xaf, 0x69, 0xe7, 0x3d 1272 ); 1273 DEFINE_HEX_XDR_NETOBJ(aes256_cts_hmac_sha384_192_Ke, 1274 0x56, 0xab, 0x22, 0xbe, 0xe6, 0x3d, 0x82, 0xd7, 1275 0xbc, 0x52, 0x27, 0xf6, 0x77, 0x3f, 0x8e, 0xa7, 1276 0xa5, 0xeb, 0x1c, 0x82, 0x51, 0x60, 0xc3, 0x83, 1277 0x12, 0x98, 0x0c, 0x44, 0x2e, 0x5c, 0x7e, 0x49 1278 ); 1279 DEFINE_HEX_XDR_NETOBJ(aes256_cts_hmac_sha384_192_Ki, 1280 0x69, 0xb1, 0x65, 0x14, 0xe3, 0xcd, 0x8e, 0x56, 1281 0xb8, 0x20, 0x10, 0xd5, 0xc7, 0x30, 0x12, 0xb6, 1282 0x22, 0xc4, 0xd0, 0x0f, 0xfc, 0x23, 0xed, 0x1f 1283 ); 1284 1285 static const struct gss_krb5_test_param rfc8009_kdf_test_params[] = { 1286 { 1287 .desc = "Derive Kc subkey for aes128-cts-hmac-sha256-128", 1288 .enctype = ENCTYPE_AES128_CTS_HMAC_SHA256_128, 1289 .base_key = &aes128_cts_hmac_sha256_128_basekey, 1290 .usage = &usage_checksum, 1291 .expected_result = &aes128_cts_hmac_sha256_128_Kc, 1292 }, 1293 { 1294 .desc = "Derive Ke subkey for aes128-cts-hmac-sha256-128", 1295 .enctype = ENCTYPE_AES128_CTS_HMAC_SHA256_128, 1296 .base_key = &aes128_cts_hmac_sha256_128_basekey, 1297 .usage = &usage_encryption, 1298 .expected_result = &aes128_cts_hmac_sha256_128_Ke, 1299 }, 1300 { 1301 .desc = "Derive Ki subkey for aes128-cts-hmac-sha256-128", 1302 .enctype = ENCTYPE_AES128_CTS_HMAC_SHA256_128, 1303 .base_key = &aes128_cts_hmac_sha256_128_basekey, 1304 .usage = &usage_integrity, 1305 .expected_result = &aes128_cts_hmac_sha256_128_Ki, 1306 }, 1307 { 1308 .desc = "Derive Kc subkey for aes256-cts-hmac-sha384-192", 1309 .enctype = ENCTYPE_AES256_CTS_HMAC_SHA384_192, 1310 .base_key = &aes256_cts_hmac_sha384_192_basekey, 1311 .usage = &usage_checksum, 1312 .expected_result = &aes256_cts_hmac_sha384_192_Kc, 1313 }, 1314 { 1315 .desc = "Derive Ke subkey for aes256-cts-hmac-sha384-192", 1316 .enctype = ENCTYPE_AES256_CTS_HMAC_SHA384_192, 1317 .base_key = &aes256_cts_hmac_sha384_192_basekey, 1318 .usage = &usage_encryption, 1319 .expected_result = &aes256_cts_hmac_sha384_192_Ke, 1320 }, 1321 { 1322 .desc = "Derive Ki subkey for aes256-cts-hmac-sha384-192", 1323 .enctype = ENCTYPE_AES256_CTS_HMAC_SHA384_192, 1324 .base_key = &aes256_cts_hmac_sha384_192_basekey, 1325 .usage = &usage_integrity, 1326 .expected_result = &aes256_cts_hmac_sha384_192_Ki, 1327 }, 1328 }; 1329 1330 /* Creates the function rfc8009_kdf_gen_params */ 1331 KUNIT_ARRAY_PARAM(rfc8009_kdf, rfc8009_kdf_test_params, gss_krb5_get_desc); 1332 1333 /* 1334 * From RFC 8009 Appendix A. Test Vectors 1335 * 1336 * These sample checksums use the above sample key derivation results, 1337 * including use of the same base-key and key usage values. 1338 * 1339 * This test material is copyright (c) 2016 IETF Trust and the 1340 * persons identified as the document authors. All rights reserved. 1341 */ 1342 1343 DEFINE_HEX_XDR_NETOBJ(rfc8009_checksum_plaintext, 1344 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 1345 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 1346 0x10, 0x11, 0x12, 0x13, 0x14 1347 ); 1348 DEFINE_HEX_XDR_NETOBJ(rfc8009_checksum_test1_expected_result, 1349 0xd7, 0x83, 0x67, 0x18, 0x66, 0x43, 0xd6, 0x7b, 1350 0x41, 0x1c, 0xba, 0x91, 0x39, 0xfc, 0x1d, 0xee 1351 ); 1352 DEFINE_HEX_XDR_NETOBJ(rfc8009_checksum_test2_expected_result, 1353 0x45, 0xee, 0x79, 0x15, 0x67, 0xee, 0xfc, 0xa3, 1354 0x7f, 0x4a, 0xc1, 0xe0, 0x22, 0x2d, 0xe8, 0x0d, 1355 0x43, 0xc3, 0xbf, 0xa0, 0x66, 0x99, 0x67, 0x2a 1356 ); 1357 1358 static const struct gss_krb5_test_param rfc8009_checksum_test_params[] = { 1359 { 1360 .desc = "Checksum with aes128-cts-hmac-sha256-128", 1361 .enctype = ENCTYPE_AES128_CTS_HMAC_SHA256_128, 1362 .base_key = &aes128_cts_hmac_sha256_128_basekey, 1363 .usage = &usage_checksum, 1364 .plaintext = &rfc8009_checksum_plaintext, 1365 .expected_result = &rfc8009_checksum_test1_expected_result, 1366 }, 1367 { 1368 .desc = "Checksum with aes256-cts-hmac-sha384-192", 1369 .enctype = ENCTYPE_AES256_CTS_HMAC_SHA384_192, 1370 .base_key = &aes256_cts_hmac_sha384_192_basekey, 1371 .usage = &usage_checksum, 1372 .plaintext = &rfc8009_checksum_plaintext, 1373 .expected_result = &rfc8009_checksum_test2_expected_result, 1374 }, 1375 }; 1376 1377 /* Creates the function rfc8009_checksum_gen_params */ 1378 KUNIT_ARRAY_PARAM(rfc8009_checksum, rfc8009_checksum_test_params, 1379 gss_krb5_get_desc); 1380 1381 /* 1382 * From RFC 8009 Appendix A. Test Vectors 1383 * 1384 * Sample encryptions (all using the default cipher state): 1385 * -------------------------------------------------------- 1386 * 1387 * These sample encryptions use the above sample key derivation results, 1388 * including use of the same base-key and key usage values. 1389 * 1390 * This test material is copyright (c) 2016 IETF Trust and the 1391 * persons identified as the document authors. All rights reserved. 1392 */ 1393 1394 static const struct xdr_netobj rfc8009_enc_empty_plaintext = { 1395 .len = 0, 1396 }; 1397 DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_short_plaintext, 1398 0x00, 0x01, 0x02, 0x03, 0x04, 0x05 1399 ); 1400 DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_block_plaintext, 1401 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 1402 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f 1403 ); 1404 DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_long_plaintext, 1405 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 1406 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 1407 0x10, 0x11, 0x12, 0x13, 0x14 1408 ); 1409 1410 DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_test1_confounder, 1411 0x7e, 0x58, 0x95, 0xea, 0xf2, 0x67, 0x24, 0x35, 1412 0xba, 0xd8, 0x17, 0xf5, 0x45, 0xa3, 0x71, 0x48 1413 ); 1414 DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_test1_expected_result, 1415 0xef, 0x85, 0xfb, 0x89, 0x0b, 0xb8, 0x47, 0x2f, 1416 0x4d, 0xab, 0x20, 0x39, 0x4d, 0xca, 0x78, 0x1d 1417 ); 1418 DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_test1_expected_hmac, 1419 0xad, 0x87, 0x7e, 0xda, 0x39, 0xd5, 0x0c, 0x87, 1420 0x0c, 0x0d, 0x5a, 0x0a, 0x8e, 0x48, 0xc7, 0x18 1421 ); 1422 1423 DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_test2_confounder, 1424 0x7b, 0xca, 0x28, 0x5e, 0x2f, 0xd4, 0x13, 0x0f, 1425 0xb5, 0x5b, 0x1a, 0x5c, 0x83, 0xbc, 0x5b, 0x24 1426 ); 1427 DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_test2_expected_result, 1428 0x84, 0xd7, 0xf3, 0x07, 0x54, 0xed, 0x98, 0x7b, 1429 0xab, 0x0b, 0xf3, 0x50, 0x6b, 0xeb, 0x09, 0xcf, 1430 0xb5, 0x54, 0x02, 0xce, 0xf7, 0xe6 1431 ); 1432 DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_test2_expected_hmac, 1433 0x87, 0x7c, 0xe9, 0x9e, 0x24, 0x7e, 0x52, 0xd1, 1434 0x6e, 0xd4, 0x42, 0x1d, 0xfd, 0xf8, 0x97, 0x6c 1435 ); 1436 1437 DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_test3_confounder, 1438 0x56, 0xab, 0x21, 0x71, 0x3f, 0xf6, 0x2c, 0x0a, 1439 0x14, 0x57, 0x20, 0x0f, 0x6f, 0xa9, 0x94, 0x8f 1440 ); 1441 DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_test3_expected_result, 1442 0x35, 0x17, 0xd6, 0x40, 0xf5, 0x0d, 0xdc, 0x8a, 1443 0xd3, 0x62, 0x87, 0x22, 0xb3, 0x56, 0x9d, 0x2a, 1444 0xe0, 0x74, 0x93, 0xfa, 0x82, 0x63, 0x25, 0x40, 1445 0x80, 0xea, 0x65, 0xc1, 0x00, 0x8e, 0x8f, 0xc2 1446 ); 1447 DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_test3_expected_hmac, 1448 0x95, 0xfb, 0x48, 0x52, 0xe7, 0xd8, 0x3e, 0x1e, 1449 0x7c, 0x48, 0xc3, 0x7e, 0xeb, 0xe6, 0xb0, 0xd3 1450 ); 1451 1452 DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_test4_confounder, 1453 0xa7, 0xa4, 0xe2, 0x9a, 0x47, 0x28, 0xce, 0x10, 1454 0x66, 0x4f, 0xb6, 0x4e, 0x49, 0xad, 0x3f, 0xac 1455 ); 1456 DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_test4_expected_result, 1457 0x72, 0x0f, 0x73, 0xb1, 0x8d, 0x98, 0x59, 0xcd, 1458 0x6c, 0xcb, 0x43, 0x46, 0x11, 0x5c, 0xd3, 0x36, 1459 0xc7, 0x0f, 0x58, 0xed, 0xc0, 0xc4, 0x43, 0x7c, 1460 0x55, 0x73, 0x54, 0x4c, 0x31, 0xc8, 0x13, 0xbc, 1461 0xe1, 0xe6, 0xd0, 0x72, 0xc1 1462 ); 1463 DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_test4_expected_hmac, 1464 0x86, 0xb3, 0x9a, 0x41, 0x3c, 0x2f, 0x92, 0xca, 1465 0x9b, 0x83, 0x34, 0xa2, 0x87, 0xff, 0xcb, 0xfc 1466 ); 1467 1468 DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_test5_confounder, 1469 0xf7, 0x64, 0xe9, 0xfa, 0x15, 0xc2, 0x76, 0x47, 1470 0x8b, 0x2c, 0x7d, 0x0c, 0x4e, 0x5f, 0x58, 0xe4 1471 ); 1472 DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_test5_expected_result, 1473 0x41, 0xf5, 0x3f, 0xa5, 0xbf, 0xe7, 0x02, 0x6d, 1474 0x91, 0xfa, 0xf9, 0xbe, 0x95, 0x91, 0x95, 0xa0 1475 ); 1476 DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_test5_expected_hmac, 1477 0x58, 0x70, 0x72, 0x73, 0xa9, 0x6a, 0x40, 0xf0, 1478 0xa0, 0x19, 0x60, 0x62, 0x1a, 0xc6, 0x12, 0x74, 1479 0x8b, 0x9b, 0xbf, 0xbe, 0x7e, 0xb4, 0xce, 0x3c 1480 ); 1481 1482 DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_test6_confounder, 1483 0xb8, 0x0d, 0x32, 0x51, 0xc1, 0xf6, 0x47, 0x14, 1484 0x94, 0x25, 0x6f, 0xfe, 0x71, 0x2d, 0x0b, 0x9a 1485 ); 1486 DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_test6_expected_result, 1487 0x4e, 0xd7, 0xb3, 0x7c, 0x2b, 0xca, 0xc8, 0xf7, 1488 0x4f, 0x23, 0xc1, 0xcf, 0x07, 0xe6, 0x2b, 0xc7, 1489 0xb7, 0x5f, 0xb3, 0xf6, 0x37, 0xb9 1490 ); 1491 DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_test6_expected_hmac, 1492 0xf5, 0x59, 0xc7, 0xf6, 0x64, 0xf6, 0x9e, 0xab, 1493 0x7b, 0x60, 0x92, 0x23, 0x75, 0x26, 0xea, 0x0d, 1494 0x1f, 0x61, 0xcb, 0x20, 0xd6, 0x9d, 0x10, 0xf2 1495 ); 1496 1497 DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_test7_confounder, 1498 0x53, 0xbf, 0x8a, 0x0d, 0x10, 0x52, 0x65, 0xd4, 1499 0xe2, 0x76, 0x42, 0x86, 0x24, 0xce, 0x5e, 0x63 1500 ); 1501 DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_test7_expected_result, 1502 0xbc, 0x47, 0xff, 0xec, 0x79, 0x98, 0xeb, 0x91, 1503 0xe8, 0x11, 0x5c, 0xf8, 0xd1, 0x9d, 0xac, 0x4b, 1504 0xbb, 0xe2, 0xe1, 0x63, 0xe8, 0x7d, 0xd3, 0x7f, 1505 0x49, 0xbe, 0xca, 0x92, 0x02, 0x77, 0x64, 0xf6 1506 ); 1507 DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_test7_expected_hmac, 1508 0x8c, 0xf5, 0x1f, 0x14, 0xd7, 0x98, 0xc2, 0x27, 1509 0x3f, 0x35, 0xdf, 0x57, 0x4d, 0x1f, 0x93, 0x2e, 1510 0x40, 0xc4, 0xff, 0x25, 0x5b, 0x36, 0xa2, 0x66 1511 ); 1512 1513 DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_test8_confounder, 1514 0x76, 0x3e, 0x65, 0x36, 0x7e, 0x86, 0x4f, 0x02, 1515 0xf5, 0x51, 0x53, 0xc7, 0xe3, 0xb5, 0x8a, 0xf1 1516 ); 1517 DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_test8_expected_result, 1518 0x40, 0x01, 0x3e, 0x2d, 0xf5, 0x8e, 0x87, 0x51, 1519 0x95, 0x7d, 0x28, 0x78, 0xbc, 0xd2, 0xd6, 0xfe, 1520 0x10, 0x1c, 0xcf, 0xd5, 0x56, 0xcb, 0x1e, 0xae, 1521 0x79, 0xdb, 0x3c, 0x3e, 0xe8, 0x64, 0x29, 0xf2, 1522 0xb2, 0xa6, 0x02, 0xac, 0x86 1523 ); 1524 DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_test8_expected_hmac, 1525 0xfe, 0xf6, 0xec, 0xb6, 0x47, 0xd6, 0x29, 0x5f, 1526 0xae, 0x07, 0x7a, 0x1f, 0xeb, 0x51, 0x75, 0x08, 1527 0xd2, 0xc1, 0x6b, 0x41, 0x92, 0xe0, 0x1f, 0x62 1528 ); 1529 1530 static const struct gss_krb5_test_param rfc8009_encrypt_test_params[] = { 1531 { 1532 .desc = "Encrypt empty plaintext with aes128-cts-hmac-sha256-128", 1533 .enctype = ENCTYPE_AES128_CTS_HMAC_SHA256_128, 1534 .plaintext = &rfc8009_enc_empty_plaintext, 1535 .confounder = &rfc8009_enc_test1_confounder, 1536 .base_key = &aes128_cts_hmac_sha256_128_basekey, 1537 .expected_result = &rfc8009_enc_test1_expected_result, 1538 .expected_hmac = &rfc8009_enc_test1_expected_hmac, 1539 }, 1540 { 1541 .desc = "Encrypt short plaintext with aes128-cts-hmac-sha256-128", 1542 .enctype = ENCTYPE_AES128_CTS_HMAC_SHA256_128, 1543 .plaintext = &rfc8009_enc_short_plaintext, 1544 .confounder = &rfc8009_enc_test2_confounder, 1545 .base_key = &aes128_cts_hmac_sha256_128_basekey, 1546 .expected_result = &rfc8009_enc_test2_expected_result, 1547 .expected_hmac = &rfc8009_enc_test2_expected_hmac, 1548 }, 1549 { 1550 .desc = "Encrypt block plaintext with aes128-cts-hmac-sha256-128", 1551 .enctype = ENCTYPE_AES128_CTS_HMAC_SHA256_128, 1552 .plaintext = &rfc8009_enc_block_plaintext, 1553 .confounder = &rfc8009_enc_test3_confounder, 1554 .base_key = &aes128_cts_hmac_sha256_128_basekey, 1555 .expected_result = &rfc8009_enc_test3_expected_result, 1556 .expected_hmac = &rfc8009_enc_test3_expected_hmac, 1557 }, 1558 { 1559 .desc = "Encrypt long plaintext with aes128-cts-hmac-sha256-128", 1560 .enctype = ENCTYPE_AES128_CTS_HMAC_SHA256_128, 1561 .plaintext = &rfc8009_enc_long_plaintext, 1562 .confounder = &rfc8009_enc_test4_confounder, 1563 .base_key = &aes128_cts_hmac_sha256_128_basekey, 1564 .expected_result = &rfc8009_enc_test4_expected_result, 1565 .expected_hmac = &rfc8009_enc_test4_expected_hmac, 1566 }, 1567 { 1568 .desc = "Encrypt empty plaintext with aes256-cts-hmac-sha384-192", 1569 .enctype = ENCTYPE_AES256_CTS_HMAC_SHA384_192, 1570 .plaintext = &rfc8009_enc_empty_plaintext, 1571 .confounder = &rfc8009_enc_test5_confounder, 1572 .base_key = &aes256_cts_hmac_sha384_192_basekey, 1573 .expected_result = &rfc8009_enc_test5_expected_result, 1574 .expected_hmac = &rfc8009_enc_test5_expected_hmac, 1575 }, 1576 { 1577 .desc = "Encrypt short plaintext with aes256-cts-hmac-sha384-192", 1578 .enctype = ENCTYPE_AES256_CTS_HMAC_SHA384_192, 1579 .plaintext = &rfc8009_enc_short_plaintext, 1580 .confounder = &rfc8009_enc_test6_confounder, 1581 .base_key = &aes256_cts_hmac_sha384_192_basekey, 1582 .expected_result = &rfc8009_enc_test6_expected_result, 1583 .expected_hmac = &rfc8009_enc_test6_expected_hmac, 1584 }, 1585 { 1586 .desc = "Encrypt block plaintext with aes256-cts-hmac-sha384-192", 1587 .enctype = ENCTYPE_AES256_CTS_HMAC_SHA384_192, 1588 .plaintext = &rfc8009_enc_block_plaintext, 1589 .confounder = &rfc8009_enc_test7_confounder, 1590 .base_key = &aes256_cts_hmac_sha384_192_basekey, 1591 .expected_result = &rfc8009_enc_test7_expected_result, 1592 .expected_hmac = &rfc8009_enc_test7_expected_hmac, 1593 }, 1594 { 1595 .desc = "Encrypt long plaintext with aes256-cts-hmac-sha384-192", 1596 .enctype = ENCTYPE_AES256_CTS_HMAC_SHA384_192, 1597 .plaintext = &rfc8009_enc_long_plaintext, 1598 .confounder = &rfc8009_enc_test8_confounder, 1599 .base_key = &aes256_cts_hmac_sha384_192_basekey, 1600 .expected_result = &rfc8009_enc_test8_expected_result, 1601 .expected_hmac = &rfc8009_enc_test8_expected_hmac, 1602 }, 1603 }; 1604 1605 /* Creates the function rfc8009_encrypt_gen_params */ 1606 KUNIT_ARRAY_PARAM(rfc8009_encrypt, rfc8009_encrypt_test_params, 1607 gss_krb5_get_desc); 1608 1609 static void rfc8009_encrypt_case(struct kunit *test) 1610 { 1611 const struct gss_krb5_test_param *param = test->param_value; 1612 struct crypto_sync_skcipher *cts_tfm, *cbc_tfm; 1613 const struct gss_krb5_enctype *gk5e; 1614 struct xdr_netobj Ke, Ki, checksum; 1615 u8 usage_data[GSS_KRB5_K5CLENGTH]; 1616 struct xdr_netobj usage = { 1617 .data = usage_data, 1618 .len = sizeof(usage_data), 1619 }; 1620 struct crypto_ahash *ahash_tfm; 1621 struct xdr_buf buf; 1622 void *text; 1623 size_t len; 1624 u32 err; 1625 1626 /* Arrange */ 1627 gk5e = gss_krb5_lookup_enctype(param->enctype); 1628 if (!gk5e) 1629 kunit_skip(test, "Encryption type is not available"); 1630 1631 *(__be32 *)usage.data = cpu_to_be32(2); 1632 1633 Ke.len = gk5e->Ke_length; 1634 Ke.data = kunit_kzalloc(test, Ke.len, GFP_KERNEL); 1635 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, Ke.data); 1636 usage.data[4] = KEY_USAGE_SEED_ENCRYPTION; 1637 err = gk5e->derive_key(gk5e, param->base_key, &Ke, 1638 &usage, GFP_KERNEL); 1639 KUNIT_ASSERT_EQ(test, err, 0); 1640 1641 cbc_tfm = crypto_alloc_sync_skcipher(gk5e->aux_cipher, 0, 0); 1642 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, cbc_tfm); 1643 err = crypto_sync_skcipher_setkey(cbc_tfm, Ke.data, Ke.len); 1644 KUNIT_ASSERT_EQ(test, err, 0); 1645 1646 cts_tfm = crypto_alloc_sync_skcipher(gk5e->encrypt_name, 0, 0); 1647 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, cts_tfm); 1648 err = crypto_sync_skcipher_setkey(cts_tfm, Ke.data, Ke.len); 1649 KUNIT_ASSERT_EQ(test, err, 0); 1650 1651 len = param->confounder->len + param->plaintext->len; 1652 text = kunit_kzalloc(test, len, GFP_KERNEL); 1653 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, text); 1654 memcpy(text, param->confounder->data, param->confounder->len); 1655 memcpy(text + param->confounder->len, param->plaintext->data, 1656 param->plaintext->len); 1657 1658 memset(&buf, 0, sizeof(buf)); 1659 buf.head[0].iov_base = text; 1660 buf.head[0].iov_len = param->confounder->len + param->plaintext->len; 1661 buf.len = buf.head[0].iov_len; 1662 1663 checksum.len = gk5e->cksumlength; 1664 checksum.data = kunit_kzalloc(test, checksum.len, GFP_KERNEL); 1665 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, checksum.data); 1666 1667 Ki.len = gk5e->Ki_length; 1668 Ki.data = kunit_kzalloc(test, Ki.len, GFP_KERNEL); 1669 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, Ki.data); 1670 usage.data[4] = KEY_USAGE_SEED_INTEGRITY; 1671 err = gk5e->derive_key(gk5e, param->base_key, &Ki, 1672 &usage, GFP_KERNEL); 1673 KUNIT_ASSERT_EQ(test, err, 0); 1674 1675 ahash_tfm = crypto_alloc_ahash(gk5e->cksum_name, 0, CRYPTO_ALG_ASYNC); 1676 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ahash_tfm); 1677 err = crypto_ahash_setkey(ahash_tfm, Ki.data, Ki.len); 1678 KUNIT_ASSERT_EQ(test, err, 0); 1679 1680 /* Act */ 1681 err = krb5_cbc_cts_encrypt(cts_tfm, cbc_tfm, 0, &buf, NULL, NULL, 0); 1682 KUNIT_ASSERT_EQ(test, err, 0); 1683 err = krb5_etm_checksum(cts_tfm, ahash_tfm, &buf, 0, &checksum); 1684 KUNIT_ASSERT_EQ(test, err, 0); 1685 1686 /* Assert */ 1687 KUNIT_EXPECT_EQ_MSG(test, 1688 param->expected_result->len, buf.len, 1689 "ciphertext length mismatch"); 1690 KUNIT_EXPECT_EQ_MSG(test, 1691 memcmp(param->expected_result->data, 1692 buf.head[0].iov_base, 1693 param->expected_result->len), 0, 1694 "ciphertext mismatch"); 1695 KUNIT_EXPECT_EQ_MSG(test, memcmp(param->expected_hmac->data, 1696 checksum.data, 1697 checksum.len), 0, 1698 "HMAC mismatch"); 1699 1700 crypto_free_ahash(ahash_tfm); 1701 crypto_free_sync_skcipher(cts_tfm); 1702 crypto_free_sync_skcipher(cbc_tfm); 1703 } 1704 1705 static struct kunit_case rfc8009_test_cases[] = { 1706 { 1707 .name = "RFC 8009 key derivation", 1708 .run_case = kdf_case, 1709 .generate_params = rfc8009_kdf_gen_params, 1710 }, 1711 { 1712 .name = "RFC 8009 checksum", 1713 .run_case = checksum_case, 1714 .generate_params = rfc8009_checksum_gen_params, 1715 }, 1716 { 1717 .name = "RFC 8009 encryption", 1718 .run_case = rfc8009_encrypt_case, 1719 .generate_params = rfc8009_encrypt_gen_params, 1720 }, 1721 {} 1722 }; 1723 1724 static struct kunit_suite rfc8009_suite = { 1725 .name = "RFC 8009 suite", 1726 .test_cases = rfc8009_test_cases, 1727 }; 1728 1729 /* 1730 * Encryption self-tests 1731 */ 1732 1733 DEFINE_STR_XDR_NETOBJ(encrypt_selftest_plaintext, 1734 "This is the plaintext for the encryption self-test."); 1735 1736 static const struct gss_krb5_test_param encrypt_selftest_params[] = { 1737 { 1738 .desc = "aes128-cts-hmac-sha1-96 encryption self-test", 1739 .enctype = ENCTYPE_AES128_CTS_HMAC_SHA1_96, 1740 .Ke = &rfc3962_encryption_key, 1741 .plaintext = &encrypt_selftest_plaintext, 1742 }, 1743 { 1744 .desc = "aes256-cts-hmac-sha1-96 encryption self-test", 1745 .enctype = ENCTYPE_AES256_CTS_HMAC_SHA1_96, 1746 .Ke = &rfc3962_encryption_key, 1747 .plaintext = &encrypt_selftest_plaintext, 1748 }, 1749 { 1750 .desc = "camellia128-cts-cmac encryption self-test", 1751 .enctype = ENCTYPE_CAMELLIA128_CTS_CMAC, 1752 .Ke = &camellia128_cts_cmac_Ke, 1753 .plaintext = &encrypt_selftest_plaintext, 1754 }, 1755 { 1756 .desc = "camellia256-cts-cmac encryption self-test", 1757 .enctype = ENCTYPE_CAMELLIA256_CTS_CMAC, 1758 .Ke = &camellia256_cts_cmac_Ke, 1759 .plaintext = &encrypt_selftest_plaintext, 1760 }, 1761 { 1762 .desc = "aes128-cts-hmac-sha256-128 encryption self-test", 1763 .enctype = ENCTYPE_AES128_CTS_HMAC_SHA256_128, 1764 .Ke = &aes128_cts_hmac_sha256_128_Ke, 1765 .plaintext = &encrypt_selftest_plaintext, 1766 }, 1767 { 1768 .desc = "aes256-cts-hmac-sha384-192 encryption self-test", 1769 .enctype = ENCTYPE_AES256_CTS_HMAC_SHA384_192, 1770 .Ke = &aes256_cts_hmac_sha384_192_Ke, 1771 .plaintext = &encrypt_selftest_plaintext, 1772 }, 1773 }; 1774 1775 /* Creates the function encrypt_selftest_gen_params */ 1776 KUNIT_ARRAY_PARAM(encrypt_selftest, encrypt_selftest_params, 1777 gss_krb5_get_desc); 1778 1779 /* 1780 * Encrypt and decrypt plaintext, and ensure the input plaintext 1781 * matches the output plaintext. A confounder is not added in this 1782 * case. 1783 */ 1784 static void encrypt_selftest_case(struct kunit *test) 1785 { 1786 const struct gss_krb5_test_param *param = test->param_value; 1787 struct crypto_sync_skcipher *cts_tfm, *cbc_tfm; 1788 const struct gss_krb5_enctype *gk5e; 1789 struct xdr_buf buf; 1790 void *text; 1791 int err; 1792 1793 /* Arrange */ 1794 gk5e = gss_krb5_lookup_enctype(param->enctype); 1795 if (!gk5e) 1796 kunit_skip(test, "Encryption type is not available"); 1797 1798 cbc_tfm = crypto_alloc_sync_skcipher(gk5e->aux_cipher, 0, 0); 1799 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, cbc_tfm); 1800 err = crypto_sync_skcipher_setkey(cbc_tfm, param->Ke->data, param->Ke->len); 1801 KUNIT_ASSERT_EQ(test, err, 0); 1802 1803 cts_tfm = crypto_alloc_sync_skcipher(gk5e->encrypt_name, 0, 0); 1804 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, cts_tfm); 1805 err = crypto_sync_skcipher_setkey(cts_tfm, param->Ke->data, param->Ke->len); 1806 KUNIT_ASSERT_EQ(test, err, 0); 1807 1808 text = kunit_kzalloc(test, roundup(param->plaintext->len, 1809 crypto_sync_skcipher_blocksize(cbc_tfm)), 1810 GFP_KERNEL); 1811 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, text); 1812 1813 memcpy(text, param->plaintext->data, param->plaintext->len); 1814 memset(&buf, 0, sizeof(buf)); 1815 buf.head[0].iov_base = text; 1816 buf.head[0].iov_len = param->plaintext->len; 1817 buf.len = buf.head[0].iov_len; 1818 1819 /* Act */ 1820 err = krb5_cbc_cts_encrypt(cts_tfm, cbc_tfm, 0, &buf, NULL, NULL, 0); 1821 KUNIT_ASSERT_EQ(test, err, 0); 1822 err = krb5_cbc_cts_decrypt(cts_tfm, cbc_tfm, 0, &buf); 1823 KUNIT_ASSERT_EQ(test, err, 0); 1824 1825 /* Assert */ 1826 KUNIT_EXPECT_EQ_MSG(test, 1827 param->plaintext->len, buf.len, 1828 "length mismatch"); 1829 KUNIT_EXPECT_EQ_MSG(test, 1830 memcmp(param->plaintext->data, 1831 buf.head[0].iov_base, buf.len), 0, 1832 "plaintext mismatch"); 1833 1834 crypto_free_sync_skcipher(cts_tfm); 1835 crypto_free_sync_skcipher(cbc_tfm); 1836 } 1837 1838 static struct kunit_case encryption_test_cases[] = { 1839 { 1840 .name = "Encryption self-tests", 1841 .run_case = encrypt_selftest_case, 1842 .generate_params = encrypt_selftest_gen_params, 1843 }, 1844 {} 1845 }; 1846 1847 static struct kunit_suite encryption_test_suite = { 1848 .name = "Encryption test suite", 1849 .test_cases = encryption_test_cases, 1850 }; 1851 1852 kunit_test_suites(&rfc3961_suite, 1853 &rfc3962_suite, 1854 &rfc6803_suite, 1855 &rfc8009_suite, 1856 &encryption_test_suite); 1857 1858 MODULE_DESCRIPTION("Test RPCSEC GSS Kerberos 5 functions"); 1859 MODULE_LICENSE("GPL"); 1860