1*b09bd2d9SEric Biggers // SPDX-License-Identifier: GPL-2.0-or-later 2*b09bd2d9SEric Biggers /* 3*b09bd2d9SEric Biggers * KUnit test suite for AES-GCM 4*b09bd2d9SEric Biggers * 5*b09bd2d9SEric Biggers * Copyright 2026 Google LLC 6*b09bd2d9SEric Biggers */ 7*b09bd2d9SEric Biggers #include <crypto/aes-gcm.h> 8*b09bd2d9SEric Biggers #include <crypto/blake2s.h> 9*b09bd2d9SEric Biggers #include "test-utils.h" 10*b09bd2d9SEric Biggers 11*b09bd2d9SEric Biggers /* The kernel's AES-GCM implementation supports only 12-byte nonces. */ 12*b09bd2d9SEric Biggers #define AES_GCM_NONCE_LEN 12 13*b09bd2d9SEric Biggers 14*b09bd2d9SEric Biggers /* 15*b09bd2d9SEric Biggers * AES-GCM test vectors from the original paper "The Galois/Counter Mode of 16*b09bd2d9SEric Biggers * Operation (GCM)" by McGrew & Viega. Vectors with nonce lengths other than 12 17*b09bd2d9SEric Biggers * bytes are excluded. 18*b09bd2d9SEric Biggers */ 19*b09bd2d9SEric Biggers static const struct aes_gcm_testvec { 20*b09bd2d9SEric Biggers const char *name; 21*b09bd2d9SEric Biggers const char *key; 22*b09bd2d9SEric Biggers size_t key_len; 23*b09bd2d9SEric Biggers const char *nonce; 24*b09bd2d9SEric Biggers size_t nonce_len; 25*b09bd2d9SEric Biggers const char *ad; 26*b09bd2d9SEric Biggers size_t ad_len; 27*b09bd2d9SEric Biggers const char *ptext; 28*b09bd2d9SEric Biggers const char *ctext; 29*b09bd2d9SEric Biggers size_t data_len; 30*b09bd2d9SEric Biggers const char *tag; 31*b09bd2d9SEric Biggers size_t tag_len; 32*b09bd2d9SEric Biggers } aes_gcm_testvecs[] = { 33*b09bd2d9SEric Biggers /* AES-128 Test Vectors */ 34*b09bd2d9SEric Biggers { 35*b09bd2d9SEric Biggers .name = "McGrew & Viega Test Case 1", 36*b09bd2d9SEric Biggers .key = "\x00\x00\x00\x00\x00\x00\x00\x00" 37*b09bd2d9SEric Biggers "\x00\x00\x00\x00\x00\x00\x00\x00", 38*b09bd2d9SEric Biggers .key_len = 16, 39*b09bd2d9SEric Biggers .nonce = "\x00\x00\x00\x00\x00\x00\x00\x00" 40*b09bd2d9SEric Biggers "\x00\x00\x00\x00", 41*b09bd2d9SEric Biggers .nonce_len = 12, 42*b09bd2d9SEric Biggers .ptext = "", 43*b09bd2d9SEric Biggers .ctext = "", 44*b09bd2d9SEric Biggers .data_len = 0, 45*b09bd2d9SEric Biggers .ad = "", 46*b09bd2d9SEric Biggers .ad_len = 0, 47*b09bd2d9SEric Biggers .tag = "\x58\xe2\xfc\xce\xfa\x7e\x30\x61" 48*b09bd2d9SEric Biggers "\x36\x7f\x1d\x57\xa4\xe7\x45\x5a", 49*b09bd2d9SEric Biggers .tag_len = 16, 50*b09bd2d9SEric Biggers }, 51*b09bd2d9SEric Biggers { 52*b09bd2d9SEric Biggers .name = "McGrew & Viega Test Case 2", 53*b09bd2d9SEric Biggers .key = "\x00\x00\x00\x00\x00\x00\x00\x00" 54*b09bd2d9SEric Biggers "\x00\x00\x00\x00\x00\x00\x00\x00", 55*b09bd2d9SEric Biggers .key_len = 16, 56*b09bd2d9SEric Biggers .nonce = "\x00\x00\x00\x00\x00\x00\x00\x00" 57*b09bd2d9SEric Biggers "\x00\x00\x00\x00", 58*b09bd2d9SEric Biggers .nonce_len = 12, 59*b09bd2d9SEric Biggers .ptext = "\x00\x00\x00\x00\x00\x00\x00\x00" 60*b09bd2d9SEric Biggers "\x00\x00\x00\x00\x00\x00\x00\x00", 61*b09bd2d9SEric Biggers .ctext = "\x03\x88\xda\xce\x60\xb6\xa3\x92" 62*b09bd2d9SEric Biggers "\xf3\x28\xc2\xb9\x71\xb2\xfe\x78", 63*b09bd2d9SEric Biggers .data_len = 16, 64*b09bd2d9SEric Biggers .ad = "", 65*b09bd2d9SEric Biggers .ad_len = 0, 66*b09bd2d9SEric Biggers .tag = "\xab\x6e\x47\xd4\x2c\xec\x13\xbd" 67*b09bd2d9SEric Biggers "\xf5\x3a\x67\xb2\x12\x57\xbd\xdf", 68*b09bd2d9SEric Biggers .tag_len = 16, 69*b09bd2d9SEric Biggers }, 70*b09bd2d9SEric Biggers { 71*b09bd2d9SEric Biggers .name = "McGrew & Viega Test Case 3", 72*b09bd2d9SEric Biggers .key = "\xfe\xff\xe9\x92\x86\x65\x73\x1c" 73*b09bd2d9SEric Biggers "\x6d\x6a\x8f\x94\x67\x30\x83\x08", 74*b09bd2d9SEric Biggers .key_len = 16, 75*b09bd2d9SEric Biggers .nonce = "\xca\xfe\xba\xbe\xfa\xce\xdb\xad" 76*b09bd2d9SEric Biggers "\xde\xca\xf8\x88", 77*b09bd2d9SEric Biggers .nonce_len = 12, 78*b09bd2d9SEric Biggers .ptext = "\xd9\x31\x32\x25\xf8\x84\x06\xe5" 79*b09bd2d9SEric Biggers "\xa5\x59\x09\xc5\xaf\xf5\x26\x9a" 80*b09bd2d9SEric Biggers "\x86\xa7\xa9\x53\x15\x34\xf7\xda" 81*b09bd2d9SEric Biggers "\x2e\x4c\x30\x3d\x8a\x31\x8a\x72" 82*b09bd2d9SEric Biggers "\x1c\x3c\x0c\x95\x95\x68\x09\x53" 83*b09bd2d9SEric Biggers "\x2f\xcf\x0e\x24\x49\xa6\xb5\x25" 84*b09bd2d9SEric Biggers "\xb1\x6a\xed\xf5\xaa\x0d\xe6\x57" 85*b09bd2d9SEric Biggers "\xba\x63\x7b\x39\x1a\xaf\xd2\x55", 86*b09bd2d9SEric Biggers .ctext = "\x42\x83\x1e\xc2\x21\x77\x74\x24" 87*b09bd2d9SEric Biggers "\x4b\x72\x21\xb7\x84\xd0\xd4\x9c" 88*b09bd2d9SEric Biggers "\xe3\xaa\x21\x2f\x2c\x02\xa4\xe0" 89*b09bd2d9SEric Biggers "\x35\xc1\x7e\x23\x29\xac\xa1\x2e" 90*b09bd2d9SEric Biggers "\x21\xd5\x14\xb2\x54\x66\x93\x1c" 91*b09bd2d9SEric Biggers "\x7d\x8f\x6a\x5a\xac\x84\xaa\x05" 92*b09bd2d9SEric Biggers "\x1b\xa3\x0b\x39\x6a\x0a\xac\x97" 93*b09bd2d9SEric Biggers "\x3d\x58\xe0\x91\x47\x3f\x59\x85", 94*b09bd2d9SEric Biggers .data_len = 64, 95*b09bd2d9SEric Biggers .ad = "", 96*b09bd2d9SEric Biggers .ad_len = 0, 97*b09bd2d9SEric Biggers .tag = "\x4d\x5c\x2a\xf3\x27\xcd\x64\xa6" 98*b09bd2d9SEric Biggers "\x2c\xf3\x5a\xbd\x2b\xa6\xfa\xb4", 99*b09bd2d9SEric Biggers .tag_len = 16, 100*b09bd2d9SEric Biggers }, 101*b09bd2d9SEric Biggers { 102*b09bd2d9SEric Biggers .name = "McGrew & Viega Test Case 4", 103*b09bd2d9SEric Biggers .key = "\xfe\xff\xe9\x92\x86\x65\x73\x1c" 104*b09bd2d9SEric Biggers "\x6d\x6a\x8f\x94\x67\x30\x83\x08", 105*b09bd2d9SEric Biggers .key_len = 16, 106*b09bd2d9SEric Biggers .nonce = "\xca\xfe\xba\xbe\xfa\xce\xdb\xad" 107*b09bd2d9SEric Biggers "\xde\xca\xf8\x88", 108*b09bd2d9SEric Biggers .nonce_len = 12, 109*b09bd2d9SEric Biggers .ptext = "\xd9\x31\x32\x25\xf8\x84\x06\xe5" 110*b09bd2d9SEric Biggers "\xa5\x59\x09\xc5\xaf\xf5\x26\x9a" 111*b09bd2d9SEric Biggers "\x86\xa7\xa9\x53\x15\x34\xf7\xda" 112*b09bd2d9SEric Biggers "\x2e\x4c\x30\x3d\x8a\x31\x8a\x72" 113*b09bd2d9SEric Biggers "\x1c\x3c\x0c\x95\x95\x68\x09\x53" 114*b09bd2d9SEric Biggers "\x2f\xcf\x0e\x24\x49\xa6\xb5\x25" 115*b09bd2d9SEric Biggers "\xb1\x6a\xed\xf5\xaa\x0d\xe6\x57" 116*b09bd2d9SEric Biggers "\xba\x63\x7b\x39", 117*b09bd2d9SEric Biggers .ctext = "\x42\x83\x1e\xc2\x21\x77\x74\x24" 118*b09bd2d9SEric Biggers "\x4b\x72\x21\xb7\x84\xd0\xd4\x9c" 119*b09bd2d9SEric Biggers "\xe3\xaa\x21\x2f\x2c\x02\xa4\xe0" 120*b09bd2d9SEric Biggers "\x35\xc1\x7e\x23\x29\xac\xa1\x2e" 121*b09bd2d9SEric Biggers "\x21\xd5\x14\xb2\x54\x66\x93\x1c" 122*b09bd2d9SEric Biggers "\x7d\x8f\x6a\x5a\xac\x84\xaa\x05" 123*b09bd2d9SEric Biggers "\x1b\xa3\x0b\x39\x6a\x0a\xac\x97" 124*b09bd2d9SEric Biggers "\x3d\x58\xe0\x91", 125*b09bd2d9SEric Biggers .data_len = 60, 126*b09bd2d9SEric Biggers .ad = "\xfe\xed\xfa\xce\xde\xad\xbe\xef" 127*b09bd2d9SEric Biggers "\xfe\xed\xfa\xce\xde\xad\xbe\xef" 128*b09bd2d9SEric Biggers "\xab\xad\xda\xd2", 129*b09bd2d9SEric Biggers .ad_len = 20, 130*b09bd2d9SEric Biggers .tag = "\x5b\xc9\x4f\xbc\x32\x21\xa5\xdb" 131*b09bd2d9SEric Biggers "\x94\xfa\xe9\x5a\xe7\x12\x1a\x47", 132*b09bd2d9SEric Biggers .tag_len = 16, 133*b09bd2d9SEric Biggers }, 134*b09bd2d9SEric Biggers 135*b09bd2d9SEric Biggers /* AES-192 Test Vectors */ 136*b09bd2d9SEric Biggers { 137*b09bd2d9SEric Biggers .name = "McGrew & Viega Test Case 7", 138*b09bd2d9SEric Biggers .key = "\x00\x00\x00\x00\x00\x00\x00\x00" 139*b09bd2d9SEric Biggers "\x00\x00\x00\x00\x00\x00\x00\x00" 140*b09bd2d9SEric Biggers "\x00\x00\x00\x00\x00\x00\x00\x00", 141*b09bd2d9SEric Biggers .key_len = 24, 142*b09bd2d9SEric Biggers .nonce = "\x00\x00\x00\x00\x00\x00\x00\x00" 143*b09bd2d9SEric Biggers "\x00\x00\x00\x00", 144*b09bd2d9SEric Biggers .nonce_len = 12, 145*b09bd2d9SEric Biggers .ptext = "", 146*b09bd2d9SEric Biggers .ctext = "", 147*b09bd2d9SEric Biggers .data_len = 0, 148*b09bd2d9SEric Biggers .ad = "", 149*b09bd2d9SEric Biggers .ad_len = 0, 150*b09bd2d9SEric Biggers .tag = "\xcd\x33\xb2\x8a\xc7\x73\xf7\x4b" 151*b09bd2d9SEric Biggers "\xa0\x0e\xd1\xf3\x12\x57\x24\x35", 152*b09bd2d9SEric Biggers .tag_len = 16, 153*b09bd2d9SEric Biggers }, 154*b09bd2d9SEric Biggers { 155*b09bd2d9SEric Biggers .name = "McGrew & Viega Test Case 8", 156*b09bd2d9SEric Biggers .key = "\x00\x00\x00\x00\x00\x00\x00\x00" 157*b09bd2d9SEric Biggers "\x00\x00\x00\x00\x00\x00\x00\x00" 158*b09bd2d9SEric Biggers "\x00\x00\x00\x00\x00\x00\x00\x00", 159*b09bd2d9SEric Biggers .key_len = 24, 160*b09bd2d9SEric Biggers .nonce = "\x00\x00\x00\x00\x00\x00\x00\x00" 161*b09bd2d9SEric Biggers "\x00\x00\x00\x00", 162*b09bd2d9SEric Biggers .nonce_len = 12, 163*b09bd2d9SEric Biggers .ptext = "\x00\x00\x00\x00\x00\x00\x00\x00" 164*b09bd2d9SEric Biggers "\x00\x00\x00\x00\x00\x00\x00\x00", 165*b09bd2d9SEric Biggers .ctext = "\x98\xe7\x24\x7c\x07\xf0\xfe\x41" 166*b09bd2d9SEric Biggers "\x1c\x26\x7e\x43\x84\xb0\xf6\x00", 167*b09bd2d9SEric Biggers .data_len = 16, 168*b09bd2d9SEric Biggers .ad = "", 169*b09bd2d9SEric Biggers .ad_len = 0, 170*b09bd2d9SEric Biggers .tag = "\x2f\xf5\x8d\x80\x03\x39\x27\xab" 171*b09bd2d9SEric Biggers "\x8e\xf4\xd4\x58\x75\x14\xf0\xfb", 172*b09bd2d9SEric Biggers .tag_len = 16, 173*b09bd2d9SEric Biggers }, 174*b09bd2d9SEric Biggers { 175*b09bd2d9SEric Biggers .name = "McGrew & Viega Test Case 9", 176*b09bd2d9SEric Biggers .key = "\xfe\xff\xe9\x92\x86\x65\x73\x1c" 177*b09bd2d9SEric Biggers "\x6d\x6a\x8f\x94\x67\x30\x83\x08" 178*b09bd2d9SEric Biggers "\xfe\xff\xe9\x92\x86\x65\x73\x1c", 179*b09bd2d9SEric Biggers .key_len = 24, 180*b09bd2d9SEric Biggers .nonce = "\xca\xfe\xba\xbe\xfa\xce\xdb\xad" 181*b09bd2d9SEric Biggers "\xde\xca\xf8\x88", 182*b09bd2d9SEric Biggers .nonce_len = 12, 183*b09bd2d9SEric Biggers .ptext = "\xd9\x31\x32\x25\xf8\x84\x06\xe5" 184*b09bd2d9SEric Biggers "\xa5\x59\x09\xc5\xaf\xf5\x26\x9a" 185*b09bd2d9SEric Biggers "\x86\xa7\xa9\x53\x15\x34\xf7\xda" 186*b09bd2d9SEric Biggers "\x2e\x4c\x30\x3d\x8a\x31\x8a\x72" 187*b09bd2d9SEric Biggers "\x1c\x3c\x0c\x95\x95\x68\x09\x53" 188*b09bd2d9SEric Biggers "\x2f\xcf\x0e\x24\x49\xa6\xb5\x25" 189*b09bd2d9SEric Biggers "\xb1\x6a\xed\xf5\xaa\x0d\xe6\x57" 190*b09bd2d9SEric Biggers "\xba\x63\x7b\x39\x1a\xaf\xd2\x55", 191*b09bd2d9SEric Biggers .ctext = "\x39\x80\xca\x0b\x3c\x00\xe8\x41" 192*b09bd2d9SEric Biggers "\xeb\x06\xfa\xc4\x87\x2a\x27\x57" 193*b09bd2d9SEric Biggers "\x85\x9e\x1c\xea\xa6\xef\xd9\x84" 194*b09bd2d9SEric Biggers "\x62\x85\x93\xb4\x0c\xa1\xe1\x9c" 195*b09bd2d9SEric Biggers "\x7d\x77\x3d\x00\xc1\x44\xc5\x25" 196*b09bd2d9SEric Biggers "\xac\x61\x9d\x18\xc8\x4a\x3f\x47" 197*b09bd2d9SEric Biggers "\x18\xe2\x44\x8b\x2f\xe3\x24\xd9" 198*b09bd2d9SEric Biggers "\xcc\xda\x27\x10\xac\xad\xe2\x56", 199*b09bd2d9SEric Biggers .data_len = 64, 200*b09bd2d9SEric Biggers .ad = "", 201*b09bd2d9SEric Biggers .ad_len = 0, 202*b09bd2d9SEric Biggers .tag = "\x99\x24\xa7\xc8\x58\x73\x36\xbf" 203*b09bd2d9SEric Biggers "\xb1\x18\x02\x4d\xb8\x67\x4a\x14", 204*b09bd2d9SEric Biggers .tag_len = 16, 205*b09bd2d9SEric Biggers }, 206*b09bd2d9SEric Biggers { 207*b09bd2d9SEric Biggers .name = "McGrew & Viega Test Case 10", 208*b09bd2d9SEric Biggers .key = "\xfe\xff\xe9\x92\x86\x65\x73\x1c" 209*b09bd2d9SEric Biggers "\x6d\x6a\x8f\x94\x67\x30\x83\x08" 210*b09bd2d9SEric Biggers "\xfe\xff\xe9\x92\x86\x65\x73\x1c", 211*b09bd2d9SEric Biggers .key_len = 24, 212*b09bd2d9SEric Biggers .nonce = "\xca\xfe\xba\xbe\xfa\xce\xdb\xad" 213*b09bd2d9SEric Biggers "\xde\xca\xf8\x88", 214*b09bd2d9SEric Biggers .nonce_len = 12, 215*b09bd2d9SEric Biggers .ptext = "\xd9\x31\x32\x25\xf8\x84\x06\xe5" 216*b09bd2d9SEric Biggers "\xa5\x59\x09\xc5\xaf\xf5\x26\x9a" 217*b09bd2d9SEric Biggers "\x86\xa7\xa9\x53\x15\x34\xf7\xda" 218*b09bd2d9SEric Biggers "\x2e\x4c\x30\x3d\x8a\x31\x8a\x72" 219*b09bd2d9SEric Biggers "\x1c\x3c\x0c\x95\x95\x68\x09\x53" 220*b09bd2d9SEric Biggers "\x2f\xcf\x0e\x24\x49\xa6\xb5\x25" 221*b09bd2d9SEric Biggers "\xb1\x6a\xed\xf5\xaa\x0d\xe6\x57" 222*b09bd2d9SEric Biggers "\xba\x63\x7b\x39", 223*b09bd2d9SEric Biggers .ctext = "\x39\x80\xca\x0b\x3c\x00\xe8\x41" 224*b09bd2d9SEric Biggers "\xeb\x06\xfa\xc4\x87\x2a\x27\x57" 225*b09bd2d9SEric Biggers "\x85\x9e\x1c\xea\xa6\xef\xd9\x84" 226*b09bd2d9SEric Biggers "\x62\x85\x93\xb4\x0c\xa1\xe1\x9c" 227*b09bd2d9SEric Biggers "\x7d\x77\x3d\x00\xc1\x44\xc5\x25" 228*b09bd2d9SEric Biggers "\xac\x61\x9d\x18\xc8\x4a\x3f\x47" 229*b09bd2d9SEric Biggers "\x18\xe2\x44\x8b\x2f\xe3\x24\xd9" 230*b09bd2d9SEric Biggers "\xcc\xda\x27\x10", 231*b09bd2d9SEric Biggers .data_len = 60, 232*b09bd2d9SEric Biggers .ad = "\xfe\xed\xfa\xce\xde\xad\xbe\xef" 233*b09bd2d9SEric Biggers "\xfe\xed\xfa\xce\xde\xad\xbe\xef" 234*b09bd2d9SEric Biggers "\xab\xad\xda\xd2", 235*b09bd2d9SEric Biggers .ad_len = 20, 236*b09bd2d9SEric Biggers .tag = "\x25\x19\x49\x8e\x80\xf1\x47\x8f" 237*b09bd2d9SEric Biggers "\x37\xba\x55\xbd\x6d\x27\x61\x8c", 238*b09bd2d9SEric Biggers .tag_len = 16, 239*b09bd2d9SEric Biggers }, 240*b09bd2d9SEric Biggers 241*b09bd2d9SEric Biggers /* AES-256 Test Vectors */ 242*b09bd2d9SEric Biggers { 243*b09bd2d9SEric Biggers .name = "McGrew & Viega Test Case 13", 244*b09bd2d9SEric Biggers .key = "\x00\x00\x00\x00\x00\x00\x00\x00" 245*b09bd2d9SEric Biggers "\x00\x00\x00\x00\x00\x00\x00\x00" 246*b09bd2d9SEric Biggers "\x00\x00\x00\x00\x00\x00\x00\x00" 247*b09bd2d9SEric Biggers "\x00\x00\x00\x00\x00\x00\x00\x00", 248*b09bd2d9SEric Biggers .key_len = 32, 249*b09bd2d9SEric Biggers .nonce = "\x00\x00\x00\x00\x00\x00\x00\x00" 250*b09bd2d9SEric Biggers "\x00\x00\x00\x00", 251*b09bd2d9SEric Biggers .nonce_len = 12, 252*b09bd2d9SEric Biggers .ptext = "", 253*b09bd2d9SEric Biggers .ctext = "", 254*b09bd2d9SEric Biggers .data_len = 0, 255*b09bd2d9SEric Biggers .ad = "", 256*b09bd2d9SEric Biggers .ad_len = 0, 257*b09bd2d9SEric Biggers .tag = "\x53\x0f\x8a\xfb\xc7\x45\x36\xb9" 258*b09bd2d9SEric Biggers "\xa9\x63\xb4\xf1\xc4\xcb\x73\x8b", 259*b09bd2d9SEric Biggers .tag_len = 16, 260*b09bd2d9SEric Biggers }, 261*b09bd2d9SEric Biggers { 262*b09bd2d9SEric Biggers .name = "McGrew & Viega Test Case 14", 263*b09bd2d9SEric Biggers .key = "\x00\x00\x00\x00\x00\x00\x00\x00" 264*b09bd2d9SEric Biggers "\x00\x00\x00\x00\x00\x00\x00\x00" 265*b09bd2d9SEric Biggers "\x00\x00\x00\x00\x00\x00\x00\x00" 266*b09bd2d9SEric Biggers "\x00\x00\x00\x00\x00\x00\x00\x00", 267*b09bd2d9SEric Biggers .key_len = 32, 268*b09bd2d9SEric Biggers .nonce = "\x00\x00\x00\x00\x00\x00\x00\x00" 269*b09bd2d9SEric Biggers "\x00\x00\x00\x00", 270*b09bd2d9SEric Biggers .nonce_len = 12, 271*b09bd2d9SEric Biggers .ptext = "\x00\x00\x00\x00\x00\x00\x00\x00" 272*b09bd2d9SEric Biggers "\x00\x00\x00\x00\x00\x00\x00\x00", 273*b09bd2d9SEric Biggers .ctext = "\xce\xa7\x40\x3d\x4d\x60\x6b\x6e" 274*b09bd2d9SEric Biggers "\x07\x4e\xc5\xd3\xba\xf3\x9d\x18", 275*b09bd2d9SEric Biggers .data_len = 16, 276*b09bd2d9SEric Biggers .ad = "", 277*b09bd2d9SEric Biggers .ad_len = 0, 278*b09bd2d9SEric Biggers .tag = "\xd0\xd1\xc8\xa7\x99\x99\x6b\xf0" 279*b09bd2d9SEric Biggers "\x26\x5b\x98\xb5\xd4\x8a\xb9\x19", 280*b09bd2d9SEric Biggers .tag_len = 16, 281*b09bd2d9SEric Biggers }, 282*b09bd2d9SEric Biggers { 283*b09bd2d9SEric Biggers .name = "McGrew & Viega Test Case 15", 284*b09bd2d9SEric Biggers .key = "\xfe\xff\xe9\x92\x86\x65\x73\x1c" 285*b09bd2d9SEric Biggers "\x6d\x6a\x8f\x94\x67\x30\x83\x08" 286*b09bd2d9SEric Biggers "\xfe\xff\xe9\x92\x86\x65\x73\x1c" 287*b09bd2d9SEric Biggers "\x6d\x6a\x8f\x94\x67\x30\x83\x08", 288*b09bd2d9SEric Biggers .key_len = 32, 289*b09bd2d9SEric Biggers .nonce = "\xca\xfe\xba\xbe\xfa\xce\xdb\xad" 290*b09bd2d9SEric Biggers "\xde\xca\xf8\x88", 291*b09bd2d9SEric Biggers .nonce_len = 12, 292*b09bd2d9SEric Biggers .ptext = "\xd9\x31\x32\x25\xf8\x84\x06\xe5" 293*b09bd2d9SEric Biggers "\xa5\x59\x09\xc5\xaf\xf5\x26\x9a" 294*b09bd2d9SEric Biggers "\x86\xa7\xa9\x53\x15\x34\xf7\xda" 295*b09bd2d9SEric Biggers "\x2e\x4c\x30\x3d\x8a\x31\x8a\x72" 296*b09bd2d9SEric Biggers "\x1c\x3c\x0c\x95\x95\x68\x09\x53" 297*b09bd2d9SEric Biggers "\x2f\xcf\x0e\x24\x49\xa6\xb5\x25" 298*b09bd2d9SEric Biggers "\xb1\x6a\xed\xf5\xaa\x0d\xe6\x57" 299*b09bd2d9SEric Biggers "\xba\x63\x7b\x39\x1a\xaf\xd2\x55", 300*b09bd2d9SEric Biggers .ctext = "\x52\x2d\xc1\xf0\x99\x56\x7d\x07" 301*b09bd2d9SEric Biggers "\xf4\x7f\x37\xa3\x2a\x84\x42\x7d" 302*b09bd2d9SEric Biggers "\x64\x3a\x8c\xdc\xbf\xe5\xc0\xc9" 303*b09bd2d9SEric Biggers "\x75\x98\xa2\xbd\x25\x55\xd1\xaa" 304*b09bd2d9SEric Biggers "\x8c\xb0\x8e\x48\x59\x0d\xbb\x3d" 305*b09bd2d9SEric Biggers "\xa7\xb0\x8b\x10\x56\x82\x88\x38" 306*b09bd2d9SEric Biggers "\xc5\xf6\x1e\x63\x93\xba\x7a\x0a" 307*b09bd2d9SEric Biggers "\xbc\xc9\xf6\x62\x89\x80\x15\xad", 308*b09bd2d9SEric Biggers .data_len = 64, 309*b09bd2d9SEric Biggers .ad = "", 310*b09bd2d9SEric Biggers .ad_len = 0, 311*b09bd2d9SEric Biggers .tag = "\xb0\x94\xda\xc5\xd9\x34\x71\xbd" 312*b09bd2d9SEric Biggers "\xec\x1a\x50\x22\x70\xe3\xcc\x6c", 313*b09bd2d9SEric Biggers .tag_len = 16, 314*b09bd2d9SEric Biggers }, 315*b09bd2d9SEric Biggers { 316*b09bd2d9SEric Biggers .name = "McGrew & Viega Test Case 16", 317*b09bd2d9SEric Biggers .key = "\xfe\xff\xe9\x92\x86\x65\x73\x1c" 318*b09bd2d9SEric Biggers "\x6d\x6a\x8f\x94\x67\x30\x83\x08" 319*b09bd2d9SEric Biggers "\xfe\xff\xe9\x92\x86\x65\x73\x1c" 320*b09bd2d9SEric Biggers "\x6d\x6a\x8f\x94\x67\x30\x83\x08", 321*b09bd2d9SEric Biggers .key_len = 32, 322*b09bd2d9SEric Biggers .nonce = "\xca\xfe\xba\xbe\xfa\xce\xdb\xad" 323*b09bd2d9SEric Biggers "\xde\xca\xf8\x88", 324*b09bd2d9SEric Biggers .nonce_len = 12, 325*b09bd2d9SEric Biggers .ptext = "\xd9\x31\x32\x25\xf8\x84\x06\xe5" 326*b09bd2d9SEric Biggers "\xa5\x59\x09\xc5\xaf\xf5\x26\x9a" 327*b09bd2d9SEric Biggers "\x86\xa7\xa9\x53\x15\x34\xf7\xda" 328*b09bd2d9SEric Biggers "\x2e\x4c\x30\x3d\x8a\x31\x8a\x72" 329*b09bd2d9SEric Biggers "\x1c\x3c\x0c\x95\x95\x68\x09\x53" 330*b09bd2d9SEric Biggers "\x2f\xcf\x0e\x24\x49\xa6\xb5\x25" 331*b09bd2d9SEric Biggers "\xb1\x6a\xed\xf5\xaa\x0d\xe6\x57" 332*b09bd2d9SEric Biggers "\xba\x63\x7b\x39", 333*b09bd2d9SEric Biggers .ctext = "\x52\x2d\xc1\xf0\x99\x56\x7d\x07" 334*b09bd2d9SEric Biggers "\xf4\x7f\x37\xa3\x2a\x84\x42\x7d" 335*b09bd2d9SEric Biggers "\x64\x3a\x8c\xdc\xbf\xe5\xc0\xc9" 336*b09bd2d9SEric Biggers "\x75\x98\xa2\xbd\x25\x55\xd1\xaa" 337*b09bd2d9SEric Biggers "\x8c\xb0\x8e\x48\x59\x0d\xbb\x3d" 338*b09bd2d9SEric Biggers "\xa7\xb0\x8b\x10\x56\x82\x88\x38" 339*b09bd2d9SEric Biggers "\xc5\xf6\x1e\x63\x93\xba\x7a\x0a" 340*b09bd2d9SEric Biggers "\xbc\xc9\xf6\x62", 341*b09bd2d9SEric Biggers .data_len = 60, 342*b09bd2d9SEric Biggers .ad = "\xfe\xed\xfa\xce\xde\xad\xbe\xef" 343*b09bd2d9SEric Biggers "\xfe\xed\xfa\xce\xde\xad\xbe\xef" 344*b09bd2d9SEric Biggers "\xab\xad\xda\xd2", 345*b09bd2d9SEric Biggers .ad_len = 20, 346*b09bd2d9SEric Biggers .tag = "\x76\xfc\x6e\xce\x0f\x4e\x17\x68" 347*b09bd2d9SEric Biggers "\xcd\xdf\x88\x53\xbb\x2d\x55\x1b", 348*b09bd2d9SEric Biggers .tag_len = 16, 349*b09bd2d9SEric Biggers }, 350*b09bd2d9SEric Biggers }; 351*b09bd2d9SEric Biggers 352*b09bd2d9SEric Biggers static void test_aes_gcm_one_test_vector(struct kunit *test, 353*b09bd2d9SEric Biggers const struct aes_gcm_testvec *tv) 354*b09bd2d9SEric Biggers { 355*b09bd2d9SEric Biggers u8 *ctext = alloc_buf(test, tv->data_len); 356*b09bd2d9SEric Biggers u8 *decrypted = alloc_buf(test, tv->data_len); 357*b09bd2d9SEric Biggers u8 *tag = alloc_buf(test, tv->tag_len); 358*b09bd2d9SEric Biggers struct aes_gcm_key key; 359*b09bd2d9SEric Biggers int err; 360*b09bd2d9SEric Biggers 361*b09bd2d9SEric Biggers KUNIT_ASSERT_EQ(test, AES_GCM_NONCE_LEN, tv->nonce_len); 362*b09bd2d9SEric Biggers 363*b09bd2d9SEric Biggers err = aes_gcm_preparekey(&key, tv->key, tv->key_len, tv->tag_len); 364*b09bd2d9SEric Biggers KUNIT_ASSERT_EQ_MSG(test, 0, err, "Failed to prepare key for %s", 365*b09bd2d9SEric Biggers tv->name); 366*b09bd2d9SEric Biggers 367*b09bd2d9SEric Biggers aes_gcm_encrypt(ctext, tv->ptext, tv->data_len, tag, tv->ad, tv->ad_len, 368*b09bd2d9SEric Biggers tv->nonce, &key); 369*b09bd2d9SEric Biggers KUNIT_ASSERT_MEMEQ_MSG(test, tv->ctext, ctext, tv->data_len, 370*b09bd2d9SEric Biggers "Wrong ciphertext for %s", tv->name); 371*b09bd2d9SEric Biggers KUNIT_ASSERT_MEMEQ_MSG(test, tag, tv->tag, tv->tag_len, 372*b09bd2d9SEric Biggers "Wrong tag for %s", tv->name); 373*b09bd2d9SEric Biggers 374*b09bd2d9SEric Biggers err = aes_gcm_decrypt(decrypted, ctext, tv->data_len, tag, tv->ad, 375*b09bd2d9SEric Biggers tv->ad_len, tv->nonce, &key); 376*b09bd2d9SEric Biggers KUNIT_ASSERT_EQ_MSG(test, 0, err, "Decryption failed for %s", tv->name); 377*b09bd2d9SEric Biggers KUNIT_ASSERT_MEMEQ_MSG(test, tv->ptext, decrypted, tv->data_len, 378*b09bd2d9SEric Biggers "Wrong plaintext for %s", tv->name); 379*b09bd2d9SEric Biggers } 380*b09bd2d9SEric Biggers 381*b09bd2d9SEric Biggers static void test_aes_gcm_test_vectors(struct kunit *test) 382*b09bd2d9SEric Biggers { 383*b09bd2d9SEric Biggers for (size_t i = 0; i < ARRAY_SIZE(aes_gcm_testvecs); i++) 384*b09bd2d9SEric Biggers test_aes_gcm_one_test_vector(test, &aes_gcm_testvecs[i]); 385*b09bd2d9SEric Biggers } 386*b09bd2d9SEric Biggers 387*b09bd2d9SEric Biggers static int aes_gcm_init_test(struct aes_gcm_ctx *ctx, u64 data_len, u64 ad_len, 388*b09bd2d9SEric Biggers const u8 *nonce, size_t nonce_len, 389*b09bd2d9SEric Biggers const struct aes_gcm_key *key) 390*b09bd2d9SEric Biggers { 391*b09bd2d9SEric Biggers if (nonce_len != AES_GCM_NONCE_LEN) 392*b09bd2d9SEric Biggers return -EINVAL; 393*b09bd2d9SEric Biggers /* 394*b09bd2d9SEric Biggers * Ignore data_len and ad_len. Incremental AES-GCM doesn't need them at 395*b09bd2d9SEric Biggers * initialization time. 396*b09bd2d9SEric Biggers */ 397*b09bd2d9SEric Biggers aes_gcm_init(ctx, nonce, key); 398*b09bd2d9SEric Biggers return 0; 399*b09bd2d9SEric Biggers } 400*b09bd2d9SEric Biggers 401*b09bd2d9SEric Biggers static int aes_gcm_encrypt_test(u8 *dst, const u8 *src, size_t data_len, 402*b09bd2d9SEric Biggers u8 *authtag, const u8 *ad, size_t ad_len, 403*b09bd2d9SEric Biggers const u8 *nonce, size_t nonce_len, 404*b09bd2d9SEric Biggers const struct aes_gcm_key *key) 405*b09bd2d9SEric Biggers { 406*b09bd2d9SEric Biggers if (nonce_len != AES_GCM_NONCE_LEN) 407*b09bd2d9SEric Biggers return -EINVAL; 408*b09bd2d9SEric Biggers /* aes_gcm_encrypt() returns void. */ 409*b09bd2d9SEric Biggers aes_gcm_encrypt(dst, src, data_len, authtag, ad, ad_len, nonce, key); 410*b09bd2d9SEric Biggers return 0; 411*b09bd2d9SEric Biggers } 412*b09bd2d9SEric Biggers 413*b09bd2d9SEric Biggers static int aes_gcm_decrypt_test(u8 *dst, const u8 *src, size_t data_len, 414*b09bd2d9SEric Biggers const u8 *authtag, const u8 *ad, size_t ad_len, 415*b09bd2d9SEric Biggers const u8 *nonce, size_t nonce_len, 416*b09bd2d9SEric Biggers const struct aes_gcm_key *key) 417*b09bd2d9SEric Biggers { 418*b09bd2d9SEric Biggers if (nonce_len != AES_GCM_NONCE_LEN) 419*b09bd2d9SEric Biggers return -EINVAL; 420*b09bd2d9SEric Biggers return aes_gcm_decrypt(dst, src, data_len, authtag, ad, ad_len, nonce, 421*b09bd2d9SEric Biggers key); 422*b09bd2d9SEric Biggers } 423*b09bd2d9SEric Biggers 424*b09bd2d9SEric Biggers static const size_t aes_gcm_valid_key_lens[] = { 16, 24, 32 }; 425*b09bd2d9SEric Biggers #define AEAD_MAX_KEY_LEN 32 426*b09bd2d9SEric Biggers #define AEAD_VALID_KEY_LENS aes_gcm_valid_key_lens 427*b09bd2d9SEric Biggers 428*b09bd2d9SEric Biggers static const size_t aes_gcm_valid_nonce_lens[] = { AES_GCM_NONCE_LEN }; 429*b09bd2d9SEric Biggers #define AEAD_MAX_NONCE_LEN AES_GCM_NONCE_LEN 430*b09bd2d9SEric Biggers #define AEAD_VALID_NONCE_LENS aes_gcm_valid_nonce_lens 431*b09bd2d9SEric Biggers 432*b09bd2d9SEric Biggers static const size_t aes_gcm_valid_tag_lens[] = { 4, 8, 12, 13, 14, 15, 16 }; 433*b09bd2d9SEric Biggers #define AEAD_MAX_TAG_LEN 16 434*b09bd2d9SEric Biggers #define AEAD_VALID_TAG_LENS aes_gcm_valid_tag_lens 435*b09bd2d9SEric Biggers 436*b09bd2d9SEric Biggers #define AEAD_KEY aes_gcm_key 437*b09bd2d9SEric Biggers #define AEAD_CTX aes_gcm_ctx 438*b09bd2d9SEric Biggers #define AEAD_PREPAREKEY aes_gcm_preparekey 439*b09bd2d9SEric Biggers #define AEAD_ENCRYPT aes_gcm_encrypt_test 440*b09bd2d9SEric Biggers #define AEAD_DECRYPT aes_gcm_decrypt_test 441*b09bd2d9SEric Biggers 442*b09bd2d9SEric Biggers #define AEAD_INIT aes_gcm_init_test 443*b09bd2d9SEric Biggers #define AEAD_AUTH_UPDATE aes_gcm_auth_update 444*b09bd2d9SEric Biggers #define AEAD_ENCRYPT_UPDATE aes_gcm_encrypt_update 445*b09bd2d9SEric Biggers #define AEAD_DECRYPT_UPDATE aes_gcm_decrypt_update 446*b09bd2d9SEric Biggers #define AEAD_ENCRYPT_FINAL aes_gcm_encrypt_final 447*b09bd2d9SEric Biggers #define AEAD_DECRYPT_FINAL aes_gcm_decrypt_final 448*b09bd2d9SEric Biggers 449*b09bd2d9SEric Biggers /* This value was generated by gen-aead-testvecs.py. */ 450*b09bd2d9SEric Biggers static const u8 aes_gcm_monte_carlo_checksum[BLAKE2S_HASH_SIZE] = { 451*b09bd2d9SEric Biggers 0x6d, 0xd0, 0x6e, 0x6b, 0xde, 0x3e, 0x92, 0x9f, 0xae, 0x1f, 0xf1, 452*b09bd2d9SEric Biggers 0x84, 0x99, 0x5a, 0x9e, 0x7b, 0xfe, 0x20, 0x9e, 0x22, 0x7c, 0x5f, 453*b09bd2d9SEric Biggers 0x15, 0xb3, 0x59, 0x89, 0xd0, 0xb7, 0x74, 0x5d, 0xd2, 0xa5, 454*b09bd2d9SEric Biggers }; 455*b09bd2d9SEric Biggers #define AEAD_MONTE_CARLO_CHECKSUM aes_gcm_monte_carlo_checksum 456*b09bd2d9SEric Biggers 457*b09bd2d9SEric Biggers #include "aead-test-template.h" 458*b09bd2d9SEric Biggers 459*b09bd2d9SEric Biggers static struct kunit_case aes_gcm_test_cases[] = { 460*b09bd2d9SEric Biggers KUNIT_CASE(test_aes_gcm_test_vectors), 461*b09bd2d9SEric Biggers AEAD_KUNIT_CASES, 462*b09bd2d9SEric Biggers {}, 463*b09bd2d9SEric Biggers }; 464*b09bd2d9SEric Biggers 465*b09bd2d9SEric Biggers static struct kunit_suite aes_gcm_test_suite = { 466*b09bd2d9SEric Biggers .name = "aes_gcm", 467*b09bd2d9SEric Biggers .test_cases = aes_gcm_test_cases, 468*b09bd2d9SEric Biggers }; 469*b09bd2d9SEric Biggers kunit_test_suite(aes_gcm_test_suite); 470*b09bd2d9SEric Biggers 471*b09bd2d9SEric Biggers MODULE_DESCRIPTION("KUnit tests and benchmark for AES-GCM"); 472*b09bd2d9SEric Biggers MODULE_LICENSE("GPL"); 473