Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

crypto: lib/aesgcm - Provide minimal library implementation

Implement a minimal library version of AES-GCM based on the existing
library implementations of AES and multiplication in GF(2^128). Using
these primitives, GCM can be implemented in a straight-forward manner.

GCM has a couple of sharp edges, i.e., the amount of input data
processed with the same initialization vector (IV) should be capped to
protect the counter from 32-bit rollover (or carry), and the size of the
authentication tag should be fixed for a given key. [0]

The former concern is addressed trivially, given that the function call
API uses 32-bit signed types for the input lengths. It is still up to
the caller to avoid IV reuse in general, but this is not something we
can police at the implementation level.

As for the latter concern, let's make the authentication tag size part
of the key schedule, and only permit it to be configured as part of the
key expansion routine.

Note that table based AES implementations are susceptible to known
plaintext timing attacks on the encryption key. The AES library already
attempts to mitigate this to some extent, but given that the counter
mode encryption used by GCM operates exclusively on known plaintext by
construction (the IV and therefore the initial counter value are known
to an attacker), let's take some extra care to mitigate this, by calling
the AES library with interrupts disabled.

[0] https://nvlpubs.nist.gov/nistpubs/legacy/sp/nistspecialpublication800-38d.pdf

Link: https://lore.kernel.org/all/c6fb9b25-a4b6-2e4a-2dd1-63adda055a49@amd.com/
Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
Tested-by: Nikunj A Dadhania <nikunj@amd.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>

authored by

Ard Biesheuvel and committed by
Herbert Xu
520af5da b67ce439

+758
+22
include/crypto/gcm.h
··· 3 3 4 4 #include <linux/errno.h> 5 5 6 + #include <crypto/aes.h> 7 + #include <crypto/gf128mul.h> 8 + 6 9 #define GCM_AES_IV_SIZE 12 7 10 #define GCM_RFC4106_IV_SIZE 8 8 11 #define GCM_RFC4543_IV_SIZE 8 ··· 63 60 64 61 return 0; 65 62 } 63 + 64 + struct aesgcm_ctx { 65 + be128 ghash_key; 66 + struct crypto_aes_ctx aes_ctx; 67 + unsigned int authsize; 68 + }; 69 + 70 + int aesgcm_expandkey(struct aesgcm_ctx *ctx, const u8 *key, 71 + unsigned int keysize, unsigned int authsize); 72 + 73 + void aesgcm_encrypt(const struct aesgcm_ctx *ctx, u8 *dst, const u8 *src, 74 + int crypt_len, const u8 *assoc, int assoc_len, 75 + const u8 iv[GCM_AES_IV_SIZE], u8 *authtag); 76 + 77 + bool __must_check aesgcm_decrypt(const struct aesgcm_ctx *ctx, u8 *dst, 78 + const u8 *src, int crypt_len, const u8 *assoc, 79 + int assoc_len, const u8 iv[GCM_AES_IV_SIZE], 80 + const u8 *authtag); 81 + 66 82 #endif
+6
lib/crypto/Kconfig
··· 8 8 config CRYPTO_LIB_AES 9 9 tristate 10 10 11 + config CRYPTO_LIB_AESGCM 12 + tristate 13 + select CRYPTO_LIB_AES 14 + select CRYPTO_LIB_GF128MUL 15 + select CRYPTO_LIB_UTILS 16 + 11 17 config CRYPTO_LIB_ARC4 12 18 tristate 13 19
+3
lib/crypto/Makefile
··· 10 10 obj-$(CONFIG_CRYPTO_LIB_AES) += libaes.o 11 11 libaes-y := aes.o 12 12 13 + obj-$(CONFIG_CRYPTO_LIB_AESGCM) += libaesgcm.o 14 + libaesgcm-y := aesgcm.o 15 + 13 16 obj-$(CONFIG_CRYPTO_LIB_ARC4) += libarc4.o 14 17 libarc4-y := arc4.o 15 18
+727
lib/crypto/aesgcm.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 2 + /* 3 + * Minimal library implementation of GCM 4 + * 5 + * Copyright 2022 Google LLC 6 + */ 7 + 8 + #include <linux/module.h> 9 + 10 + #include <crypto/algapi.h> 11 + #include <crypto/gcm.h> 12 + #include <crypto/ghash.h> 13 + 14 + #include <asm/irqflags.h> 15 + 16 + static void aesgcm_encrypt_block(const struct crypto_aes_ctx *ctx, void *dst, 17 + const void *src) 18 + { 19 + unsigned long flags; 20 + 21 + /* 22 + * In AES-GCM, both the GHASH key derivation and the CTR mode 23 + * encryption operate on known plaintext, making them susceptible to 24 + * timing attacks on the encryption key. The AES library already 25 + * mitigates this risk to some extent by pulling the entire S-box into 26 + * the caches before doing any substitutions, but this strategy is more 27 + * effective when running with interrupts disabled. 28 + */ 29 + local_irq_save(flags); 30 + aes_encrypt(ctx, dst, src); 31 + local_irq_restore(flags); 32 + } 33 + 34 + /** 35 + * aesgcm_expandkey - Expands the AES and GHASH keys for the AES-GCM key 36 + * schedule 37 + * 38 + * @ctx: The data structure that will hold the AES-GCM key schedule 39 + * @key: The AES encryption input key 40 + * @keysize: The length in bytes of the input key 41 + * @authsize: The size in bytes of the GCM authentication tag 42 + * 43 + * Returns: 0 on success, or -EINVAL if @keysize or @authsize contain values 44 + * that are not permitted by the GCM specification. 45 + */ 46 + int aesgcm_expandkey(struct aesgcm_ctx *ctx, const u8 *key, 47 + unsigned int keysize, unsigned int authsize) 48 + { 49 + u8 kin[AES_BLOCK_SIZE] = {}; 50 + int ret; 51 + 52 + ret = crypto_gcm_check_authsize(authsize) ?: 53 + aes_expandkey(&ctx->aes_ctx, key, keysize); 54 + if (ret) 55 + return ret; 56 + 57 + ctx->authsize = authsize; 58 + aesgcm_encrypt_block(&ctx->aes_ctx, &ctx->ghash_key, kin); 59 + 60 + return 0; 61 + } 62 + EXPORT_SYMBOL(aesgcm_expandkey); 63 + 64 + static void aesgcm_ghash(be128 *ghash, const be128 *key, const void *src, 65 + int len) 66 + { 67 + while (len > 0) { 68 + crypto_xor((u8 *)ghash, src, min(len, GHASH_BLOCK_SIZE)); 69 + gf128mul_lle(ghash, key); 70 + 71 + src += GHASH_BLOCK_SIZE; 72 + len -= GHASH_BLOCK_SIZE; 73 + } 74 + } 75 + 76 + static void aesgcm_mac(const struct aesgcm_ctx *ctx, const u8 *src, int src_len, 77 + const u8 *assoc, int assoc_len, __be32 *ctr, u8 *authtag) 78 + { 79 + be128 tail = { cpu_to_be64(assoc_len * 8), cpu_to_be64(src_len * 8) }; 80 + u8 buf[AES_BLOCK_SIZE]; 81 + be128 ghash = {}; 82 + 83 + aesgcm_ghash(&ghash, &ctx->ghash_key, assoc, assoc_len); 84 + aesgcm_ghash(&ghash, &ctx->ghash_key, src, src_len); 85 + aesgcm_ghash(&ghash, &ctx->ghash_key, &tail, sizeof(tail)); 86 + 87 + ctr[3] = cpu_to_be32(1); 88 + aesgcm_encrypt_block(&ctx->aes_ctx, buf, ctr); 89 + crypto_xor_cpy(authtag, buf, (u8 *)&ghash, ctx->authsize); 90 + 91 + memzero_explicit(&ghash, sizeof(ghash)); 92 + memzero_explicit(buf, sizeof(buf)); 93 + } 94 + 95 + static void aesgcm_crypt(const struct aesgcm_ctx *ctx, u8 *dst, const u8 *src, 96 + int len, __be32 *ctr) 97 + { 98 + u8 buf[AES_BLOCK_SIZE]; 99 + unsigned int n = 2; 100 + 101 + while (len > 0) { 102 + /* 103 + * The counter increment below must not result in overflow or 104 + * carry into the next 32-bit word, as this could result in 105 + * inadvertent IV reuse, which must be avoided at all cost for 106 + * stream ciphers such as AES-CTR. Given the range of 'int 107 + * len', this cannot happen, so no explicit test is necessary. 108 + */ 109 + ctr[3] = cpu_to_be32(n++); 110 + aesgcm_encrypt_block(&ctx->aes_ctx, buf, ctr); 111 + crypto_xor_cpy(dst, src, buf, min(len, AES_BLOCK_SIZE)); 112 + 113 + dst += AES_BLOCK_SIZE; 114 + src += AES_BLOCK_SIZE; 115 + len -= AES_BLOCK_SIZE; 116 + } 117 + memzero_explicit(buf, sizeof(buf)); 118 + } 119 + 120 + /** 121 + * aesgcm_encrypt - Perform AES-GCM encryption on a block of data 122 + * 123 + * @ctx: The AES-GCM key schedule 124 + * @dst: Pointer to the ciphertext output buffer 125 + * @src: Pointer the plaintext (may equal @dst for encryption in place) 126 + * @crypt_len: The size in bytes of the plaintext and ciphertext. 127 + * @assoc: Pointer to the associated data, 128 + * @assoc_len: The size in bytes of the associated data 129 + * @iv: The initialization vector (IV) to use for this block of data 130 + * (must be 12 bytes in size as per the GCM spec recommendation) 131 + * @authtag: The address of the buffer in memory where the authentication 132 + * tag should be stored. The buffer is assumed to have space for 133 + * @ctx->authsize bytes. 134 + */ 135 + void aesgcm_encrypt(const struct aesgcm_ctx *ctx, u8 *dst, const u8 *src, 136 + int crypt_len, const u8 *assoc, int assoc_len, 137 + const u8 iv[GCM_AES_IV_SIZE], u8 *authtag) 138 + { 139 + __be32 ctr[4]; 140 + 141 + memcpy(ctr, iv, GCM_AES_IV_SIZE); 142 + 143 + aesgcm_crypt(ctx, dst, src, crypt_len, ctr); 144 + aesgcm_mac(ctx, dst, crypt_len, assoc, assoc_len, ctr, authtag); 145 + } 146 + EXPORT_SYMBOL(aesgcm_encrypt); 147 + 148 + /** 149 + * aesgcm_decrypt - Perform AES-GCM decryption on a block of data 150 + * 151 + * @ctx: The AES-GCM key schedule 152 + * @dst: Pointer to the plaintext output buffer 153 + * @src: Pointer the ciphertext (may equal @dst for decryption in place) 154 + * @crypt_len: The size in bytes of the plaintext and ciphertext. 155 + * @assoc: Pointer to the associated data, 156 + * @assoc_len: The size in bytes of the associated data 157 + * @iv: The initialization vector (IV) to use for this block of data 158 + * (must be 12 bytes in size as per the GCM spec recommendation) 159 + * @authtag: The address of the buffer in memory where the authentication 160 + * tag is stored. 161 + * 162 + * Returns: true on success, or false if the ciphertext failed authentication. 163 + * On failure, no plaintext will be returned. 164 + */ 165 + bool __must_check aesgcm_decrypt(const struct aesgcm_ctx *ctx, u8 *dst, 166 + const u8 *src, int crypt_len, const u8 *assoc, 167 + int assoc_len, const u8 iv[GCM_AES_IV_SIZE], 168 + const u8 *authtag) 169 + { 170 + u8 tagbuf[AES_BLOCK_SIZE]; 171 + __be32 ctr[4]; 172 + 173 + memcpy(ctr, iv, GCM_AES_IV_SIZE); 174 + 175 + aesgcm_mac(ctx, src, crypt_len, assoc, assoc_len, ctr, tagbuf); 176 + if (crypto_memneq(authtag, tagbuf, ctx->authsize)) { 177 + memzero_explicit(tagbuf, sizeof(tagbuf)); 178 + return false; 179 + } 180 + aesgcm_crypt(ctx, dst, src, crypt_len, ctr); 181 + return true; 182 + } 183 + EXPORT_SYMBOL(aesgcm_decrypt); 184 + 185 + MODULE_DESCRIPTION("Generic AES-GCM library"); 186 + MODULE_AUTHOR("Ard Biesheuvel <ardb@kernel.org>"); 187 + MODULE_LICENSE("GPL"); 188 + 189 + #ifndef CONFIG_CRYPTO_MANAGER_DISABLE_TESTS 190 + 191 + /* 192 + * Test code below. Vectors taken from crypto/testmgr.h 193 + */ 194 + 195 + static const u8 __initconst ctext0[16] = 196 + "\x58\xe2\xfc\xce\xfa\x7e\x30\x61" 197 + "\x36\x7f\x1d\x57\xa4\xe7\x45\x5a"; 198 + 199 + static const u8 __initconst ptext1[16]; 200 + 201 + static const u8 __initconst ctext1[32] = 202 + "\x03\x88\xda\xce\x60\xb6\xa3\x92" 203 + "\xf3\x28\xc2\xb9\x71\xb2\xfe\x78" 204 + "\xab\x6e\x47\xd4\x2c\xec\x13\xbd" 205 + "\xf5\x3a\x67\xb2\x12\x57\xbd\xdf"; 206 + 207 + static const u8 __initconst ptext2[64] = 208 + "\xd9\x31\x32\x25\xf8\x84\x06\xe5" 209 + "\xa5\x59\x09\xc5\xaf\xf5\x26\x9a" 210 + "\x86\xa7\xa9\x53\x15\x34\xf7\xda" 211 + "\x2e\x4c\x30\x3d\x8a\x31\x8a\x72" 212 + "\x1c\x3c\x0c\x95\x95\x68\x09\x53" 213 + "\x2f\xcf\x0e\x24\x49\xa6\xb5\x25" 214 + "\xb1\x6a\xed\xf5\xaa\x0d\xe6\x57" 215 + "\xba\x63\x7b\x39\x1a\xaf\xd2\x55"; 216 + 217 + static const u8 __initconst ctext2[80] = 218 + "\x42\x83\x1e\xc2\x21\x77\x74\x24" 219 + "\x4b\x72\x21\xb7\x84\xd0\xd4\x9c" 220 + "\xe3\xaa\x21\x2f\x2c\x02\xa4\xe0" 221 + "\x35\xc1\x7e\x23\x29\xac\xa1\x2e" 222 + "\x21\xd5\x14\xb2\x54\x66\x93\x1c" 223 + "\x7d\x8f\x6a\x5a\xac\x84\xaa\x05" 224 + "\x1b\xa3\x0b\x39\x6a\x0a\xac\x97" 225 + "\x3d\x58\xe0\x91\x47\x3f\x59\x85" 226 + "\x4d\x5c\x2a\xf3\x27\xcd\x64\xa6" 227 + "\x2c\xf3\x5a\xbd\x2b\xa6\xfa\xb4"; 228 + 229 + static const u8 __initconst ptext3[60] = 230 + "\xd9\x31\x32\x25\xf8\x84\x06\xe5" 231 + "\xa5\x59\x09\xc5\xaf\xf5\x26\x9a" 232 + "\x86\xa7\xa9\x53\x15\x34\xf7\xda" 233 + "\x2e\x4c\x30\x3d\x8a\x31\x8a\x72" 234 + "\x1c\x3c\x0c\x95\x95\x68\x09\x53" 235 + "\x2f\xcf\x0e\x24\x49\xa6\xb5\x25" 236 + "\xb1\x6a\xed\xf5\xaa\x0d\xe6\x57" 237 + "\xba\x63\x7b\x39"; 238 + 239 + static const u8 __initconst ctext3[76] = 240 + "\x42\x83\x1e\xc2\x21\x77\x74\x24" 241 + "\x4b\x72\x21\xb7\x84\xd0\xd4\x9c" 242 + "\xe3\xaa\x21\x2f\x2c\x02\xa4\xe0" 243 + "\x35\xc1\x7e\x23\x29\xac\xa1\x2e" 244 + "\x21\xd5\x14\xb2\x54\x66\x93\x1c" 245 + "\x7d\x8f\x6a\x5a\xac\x84\xaa\x05" 246 + "\x1b\xa3\x0b\x39\x6a\x0a\xac\x97" 247 + "\x3d\x58\xe0\x91" 248 + "\x5b\xc9\x4f\xbc\x32\x21\xa5\xdb" 249 + "\x94\xfa\xe9\x5a\xe7\x12\x1a\x47"; 250 + 251 + static const u8 __initconst ctext4[16] = 252 + "\xcd\x33\xb2\x8a\xc7\x73\xf7\x4b" 253 + "\xa0\x0e\xd1\xf3\x12\x57\x24\x35"; 254 + 255 + static const u8 __initconst ctext5[32] = 256 + "\x98\xe7\x24\x7c\x07\xf0\xfe\x41" 257 + "\x1c\x26\x7e\x43\x84\xb0\xf6\x00" 258 + "\x2f\xf5\x8d\x80\x03\x39\x27\xab" 259 + "\x8e\xf4\xd4\x58\x75\x14\xf0\xfb"; 260 + 261 + static const u8 __initconst ptext6[64] = 262 + "\xd9\x31\x32\x25\xf8\x84\x06\xe5" 263 + "\xa5\x59\x09\xc5\xaf\xf5\x26\x9a" 264 + "\x86\xa7\xa9\x53\x15\x34\xf7\xda" 265 + "\x2e\x4c\x30\x3d\x8a\x31\x8a\x72" 266 + "\x1c\x3c\x0c\x95\x95\x68\x09\x53" 267 + "\x2f\xcf\x0e\x24\x49\xa6\xb5\x25" 268 + "\xb1\x6a\xed\xf5\xaa\x0d\xe6\x57" 269 + "\xba\x63\x7b\x39\x1a\xaf\xd2\x55"; 270 + 271 + static const u8 __initconst ctext6[80] = 272 + "\x39\x80\xca\x0b\x3c\x00\xe8\x41" 273 + "\xeb\x06\xfa\xc4\x87\x2a\x27\x57" 274 + "\x85\x9e\x1c\xea\xa6\xef\xd9\x84" 275 + "\x62\x85\x93\xb4\x0c\xa1\xe1\x9c" 276 + "\x7d\x77\x3d\x00\xc1\x44\xc5\x25" 277 + "\xac\x61\x9d\x18\xc8\x4a\x3f\x47" 278 + "\x18\xe2\x44\x8b\x2f\xe3\x24\xd9" 279 + "\xcc\xda\x27\x10\xac\xad\xe2\x56" 280 + "\x99\x24\xa7\xc8\x58\x73\x36\xbf" 281 + "\xb1\x18\x02\x4d\xb8\x67\x4a\x14"; 282 + 283 + static const u8 __initconst ctext7[16] = 284 + "\x53\x0f\x8a\xfb\xc7\x45\x36\xb9" 285 + "\xa9\x63\xb4\xf1\xc4\xcb\x73\x8b"; 286 + 287 + static const u8 __initconst ctext8[32] = 288 + "\xce\xa7\x40\x3d\x4d\x60\x6b\x6e" 289 + "\x07\x4e\xc5\xd3\xba\xf3\x9d\x18" 290 + "\xd0\xd1\xc8\xa7\x99\x99\x6b\xf0" 291 + "\x26\x5b\x98\xb5\xd4\x8a\xb9\x19"; 292 + 293 + static const u8 __initconst ptext9[64] = 294 + "\xd9\x31\x32\x25\xf8\x84\x06\xe5" 295 + "\xa5\x59\x09\xc5\xaf\xf5\x26\x9a" 296 + "\x86\xa7\xa9\x53\x15\x34\xf7\xda" 297 + "\x2e\x4c\x30\x3d\x8a\x31\x8a\x72" 298 + "\x1c\x3c\x0c\x95\x95\x68\x09\x53" 299 + "\x2f\xcf\x0e\x24\x49\xa6\xb5\x25" 300 + "\xb1\x6a\xed\xf5\xaa\x0d\xe6\x57" 301 + "\xba\x63\x7b\x39\x1a\xaf\xd2\x55"; 302 + 303 + static const u8 __initconst ctext9[80] = 304 + "\x52\x2d\xc1\xf0\x99\x56\x7d\x07" 305 + "\xf4\x7f\x37\xa3\x2a\x84\x42\x7d" 306 + "\x64\x3a\x8c\xdc\xbf\xe5\xc0\xc9" 307 + "\x75\x98\xa2\xbd\x25\x55\xd1\xaa" 308 + "\x8c\xb0\x8e\x48\x59\x0d\xbb\x3d" 309 + "\xa7\xb0\x8b\x10\x56\x82\x88\x38" 310 + "\xc5\xf6\x1e\x63\x93\xba\x7a\x0a" 311 + "\xbc\xc9\xf6\x62\x89\x80\x15\xad" 312 + "\xb0\x94\xda\xc5\xd9\x34\x71\xbd" 313 + "\xec\x1a\x50\x22\x70\xe3\xcc\x6c"; 314 + 315 + static const u8 __initconst ptext10[60] = 316 + "\xd9\x31\x32\x25\xf8\x84\x06\xe5" 317 + "\xa5\x59\x09\xc5\xaf\xf5\x26\x9a" 318 + "\x86\xa7\xa9\x53\x15\x34\xf7\xda" 319 + "\x2e\x4c\x30\x3d\x8a\x31\x8a\x72" 320 + "\x1c\x3c\x0c\x95\x95\x68\x09\x53" 321 + "\x2f\xcf\x0e\x24\x49\xa6\xb5\x25" 322 + "\xb1\x6a\xed\xf5\xaa\x0d\xe6\x57" 323 + "\xba\x63\x7b\x39"; 324 + 325 + static const u8 __initconst ctext10[76] = 326 + "\x52\x2d\xc1\xf0\x99\x56\x7d\x07" 327 + "\xf4\x7f\x37\xa3\x2a\x84\x42\x7d" 328 + "\x64\x3a\x8c\xdc\xbf\xe5\xc0\xc9" 329 + "\x75\x98\xa2\xbd\x25\x55\xd1\xaa" 330 + "\x8c\xb0\x8e\x48\x59\x0d\xbb\x3d" 331 + "\xa7\xb0\x8b\x10\x56\x82\x88\x38" 332 + "\xc5\xf6\x1e\x63\x93\xba\x7a\x0a" 333 + "\xbc\xc9\xf6\x62" 334 + "\x76\xfc\x6e\xce\x0f\x4e\x17\x68" 335 + "\xcd\xdf\x88\x53\xbb\x2d\x55\x1b"; 336 + 337 + static const u8 __initconst ptext11[60] = 338 + "\xd9\x31\x32\x25\xf8\x84\x06\xe5" 339 + "\xa5\x59\x09\xc5\xaf\xf5\x26\x9a" 340 + "\x86\xa7\xa9\x53\x15\x34\xf7\xda" 341 + "\x2e\x4c\x30\x3d\x8a\x31\x8a\x72" 342 + "\x1c\x3c\x0c\x95\x95\x68\x09\x53" 343 + "\x2f\xcf\x0e\x24\x49\xa6\xb5\x25" 344 + "\xb1\x6a\xed\xf5\xaa\x0d\xe6\x57" 345 + "\xba\x63\x7b\x39"; 346 + 347 + static const u8 __initconst ctext11[76] = 348 + "\x39\x80\xca\x0b\x3c\x00\xe8\x41" 349 + "\xeb\x06\xfa\xc4\x87\x2a\x27\x57" 350 + "\x85\x9e\x1c\xea\xa6\xef\xd9\x84" 351 + "\x62\x85\x93\xb4\x0c\xa1\xe1\x9c" 352 + "\x7d\x77\x3d\x00\xc1\x44\xc5\x25" 353 + "\xac\x61\x9d\x18\xc8\x4a\x3f\x47" 354 + "\x18\xe2\x44\x8b\x2f\xe3\x24\xd9" 355 + "\xcc\xda\x27\x10" 356 + "\x25\x19\x49\x8e\x80\xf1\x47\x8f" 357 + "\x37\xba\x55\xbd\x6d\x27\x61\x8c"; 358 + 359 + static const u8 __initconst ptext12[719] = 360 + "\x42\xc1\xcc\x08\x48\x6f\x41\x3f" 361 + "\x2f\x11\x66\x8b\x2a\x16\xf0\xe0" 362 + "\x58\x83\xf0\xc3\x70\x14\xc0\x5b" 363 + "\x3f\xec\x1d\x25\x3c\x51\xd2\x03" 364 + "\xcf\x59\x74\x1f\xb2\x85\xb4\x07" 365 + "\xc6\x6a\x63\x39\x8a\x5b\xde\xcb" 366 + "\xaf\x08\x44\xbd\x6f\x91\x15\xe1" 367 + "\xf5\x7a\x6e\x18\xbd\xdd\x61\x50" 368 + "\x59\xa9\x97\xab\xbb\x0e\x74\x5c" 369 + "\x00\xa4\x43\x54\x04\x54\x9b\x3b" 370 + "\x77\xec\xfd\x5c\xa6\xe8\x7b\x08" 371 + "\xae\xe6\x10\x3f\x32\x65\xd1\xfc" 372 + "\xa4\x1d\x2c\x31\xfb\x33\x7a\xb3" 373 + "\x35\x23\xf4\x20\x41\xd4\xad\x82" 374 + "\x8b\xa4\xad\x96\x1c\x20\x53\xbe" 375 + "\x0e\xa6\xf4\xdc\x78\x49\x3e\x72" 376 + "\xb1\xa9\xb5\x83\xcb\x08\x54\xb7" 377 + "\xad\x49\x3a\xae\x98\xce\xa6\x66" 378 + "\x10\x30\x90\x8c\x55\x83\xd7\x7c" 379 + "\x8b\xe6\x53\xde\xd2\x6e\x18\x21" 380 + "\x01\x52\xd1\x9f\x9d\xbb\x9c\x73" 381 + "\x57\xcc\x89\x09\x75\x9b\x78\x70" 382 + "\xed\x26\x97\x4d\xb4\xe4\x0c\xa5" 383 + "\xfa\x70\x04\x70\xc6\x96\x1c\x7d" 384 + "\x54\x41\x77\xa8\xe3\xb0\x7e\x96" 385 + "\x82\xd9\xec\xa2\x87\x68\x55\xf9" 386 + "\x8f\x9e\x73\x43\x47\x6a\x08\x36" 387 + "\x93\x67\xa8\x2d\xde\xac\x41\xa9" 388 + "\x5c\x4d\x73\x97\x0f\x70\x68\xfa" 389 + "\x56\x4d\x00\xc2\x3b\x1f\xc8\xb9" 390 + "\x78\x1f\x51\x07\xe3\x9a\x13\x4e" 391 + "\xed\x2b\x2e\xa3\xf7\x44\xb2\xe7" 392 + "\xab\x19\x37\xd9\xba\x76\x5e\xd2" 393 + "\xf2\x53\x15\x17\x4c\x6b\x16\x9f" 394 + "\x02\x66\x49\xca\x7c\x91\x05\xf2" 395 + "\x45\x36\x1e\xf5\x77\xad\x1f\x46" 396 + "\xa8\x13\xfb\x63\xb6\x08\x99\x63" 397 + "\x82\xa2\xed\xb3\xac\xdf\x43\x19" 398 + "\x45\xea\x78\x73\xd9\xb7\x39\x11" 399 + "\xa3\x13\x7c\xf8\x3f\xf7\xad\x81" 400 + "\x48\x2f\xa9\x5c\x5f\xa0\xf0\x79" 401 + "\xa4\x47\x7d\x80\x20\x26\xfd\x63" 402 + "\x0a\xc7\x7e\x6d\x75\x47\xff\x76" 403 + "\x66\x2e\x8a\x6c\x81\x35\xaf\x0b" 404 + "\x2e\x6a\x49\x60\xc1\x10\xe1\xe1" 405 + "\x54\x03\xa4\x09\x0c\x37\x7a\x15" 406 + "\x23\x27\x5b\x8b\x4b\xa5\x64\x97" 407 + "\xae\x4a\x50\x73\x1f\x66\x1c\x5c" 408 + "\x03\x25\x3c\x8d\x48\x58\x71\x34" 409 + "\x0e\xec\x4e\x55\x1a\x03\x6a\xe5" 410 + "\xb6\x19\x2b\x84\x2a\x20\xd1\xea" 411 + "\x80\x6f\x96\x0e\x05\x62\xc7\x78" 412 + "\x87\x79\x60\x38\x46\xb4\x25\x57" 413 + "\x6e\x16\x63\xf8\xad\x6e\xd7\x42" 414 + "\x69\xe1\x88\xef\x6e\xd5\xb4\x9a" 415 + "\x3c\x78\x6c\x3b\xe5\xa0\x1d\x22" 416 + "\x86\x5c\x74\x3a\xeb\x24\x26\xc7" 417 + "\x09\xfc\x91\x96\x47\x87\x4f\x1a" 418 + "\xd6\x6b\x2c\x18\x47\xc0\xb8\x24" 419 + "\xa8\x5a\x4a\x9e\xcb\x03\xe7\x2a" 420 + "\x09\xe6\x4d\x9c\x6d\x86\x60\xf5" 421 + "\x2f\x48\x69\x37\x9f\xf2\xd2\xcb" 422 + "\x0e\x5a\xdd\x6e\x8a\xfb\x6a\xfe" 423 + "\x0b\x63\xde\x87\x42\x79\x8a\x68" 424 + "\x51\x28\x9b\x7a\xeb\xaf\xb8\x2f" 425 + "\x9d\xd1\xc7\x45\x90\x08\xc9\x83" 426 + "\xe9\x83\x84\xcb\x28\x69\x09\x69" 427 + "\xce\x99\x46\x00\x54\xcb\xd8\x38" 428 + "\xf9\x53\x4a\xbf\x31\xce\x57\x15" 429 + "\x33\xfa\x96\x04\x33\x42\xe3\xc0" 430 + "\xb7\x54\x4a\x65\x7a\x7c\x02\xe6" 431 + "\x19\x95\xd0\x0e\x82\x07\x63\xf9" 432 + "\xe1\x2b\x2a\xfc\x55\x92\x52\xc9" 433 + "\xb5\x9f\x23\x28\x60\xe7\x20\x51" 434 + "\x10\xd3\xed\x6d\x9b\xab\xb8\xe2" 435 + "\x5d\x9a\x34\xb3\xbe\x9c\x64\xcb" 436 + "\x78\xc6\x91\x22\x40\x91\x80\xbe" 437 + "\xd7\x78\x5c\x0e\x0a\xdc\x08\xe9" 438 + "\x67\x10\xa4\x83\x98\x79\x23\xe7" 439 + "\x92\xda\xa9\x22\x16\xb1\xe7\x78" 440 + "\xa3\x1c\x6c\x8f\x35\x7c\x4d\x37" 441 + "\x2f\x6e\x0b\x50\x5c\x34\xb9\xf9" 442 + "\xe6\x3d\x91\x0d\x32\x95\xaa\x3d" 443 + "\x48\x11\x06\xbb\x2d\xf2\x63\x88" 444 + "\x3f\x73\x09\xe2\x45\x56\x31\x51" 445 + "\xfa\x5e\x4e\x62\xf7\x90\xf9\xa9" 446 + "\x7d\x7b\x1b\xb1\xc8\x26\x6e\x66" 447 + "\xf6\x90\x9a\x7f\xf2\x57\xcc\x23" 448 + "\x59\xfa\xfa\xaa\x44\x04\x01\xa7" 449 + "\xa4\x78\xdb\x74\x3d\x8b\xb5"; 450 + 451 + static const u8 __initconst ctext12[735] = 452 + "\x84\x0b\xdb\xd5\xb7\xa8\xfe\x20" 453 + "\xbb\xb1\x12\x7f\x41\xea\xb3\xc0" 454 + "\xa2\xb4\x37\x19\x11\x58\xb6\x0b" 455 + "\x4c\x1d\x38\x05\x54\xd1\x16\x73" 456 + "\x8e\x1c\x20\x90\xa2\x9a\xb7\x74" 457 + "\x47\xe6\xd8\xfc\x18\x3a\xb4\xea" 458 + "\xd5\x16\x5a\x2c\x53\x01\x46\xb3" 459 + "\x18\x33\x74\x6c\x50\xf2\xe8\xc0" 460 + "\x73\xda\x60\x22\xeb\xe3\xe5\x9b" 461 + "\x20\x93\x6c\x4b\x37\x99\xb8\x23" 462 + "\x3b\x4e\xac\xe8\x5b\xe8\x0f\xb7" 463 + "\xc3\x8f\xfb\x4a\x37\xd9\x39\x95" 464 + "\x34\xf1\xdb\x8f\x71\xd9\xc7\x0b" 465 + "\x02\xf1\x63\xfc\x9b\xfc\xc5\xab" 466 + "\xb9\x14\x13\x21\xdf\xce\xaa\x88" 467 + "\x44\x30\x1e\xce\x26\x01\x92\xf8" 468 + "\x9f\x00\x4b\x0c\x4b\xf7\x5f\xe0" 469 + "\x89\xca\x94\x66\x11\x21\x97\xca" 470 + "\x3e\x83\x74\x2d\xdb\x4d\x11\xeb" 471 + "\x97\xc2\x14\xff\x9e\x1e\xa0\x6b" 472 + "\x08\xb4\x31\x2b\x85\xc6\x85\x6c" 473 + "\x90\xec\x39\xc0\xec\xb3\xb5\x4e" 474 + "\xf3\x9c\xe7\x83\x3a\x77\x0a\xf4" 475 + "\x56\xfe\xce\x18\x33\x6d\x0b\x2d" 476 + "\x33\xda\xc8\x05\x5c\xb4\x09\x2a" 477 + "\xde\x6b\x52\x98\x01\xef\x36\x3d" 478 + "\xbd\xf9\x8f\xa8\x3e\xaa\xcd\xd1" 479 + "\x01\x2d\x42\x49\xc3\xb6\x84\xbb" 480 + "\x48\x96\xe0\x90\x93\x6c\x48\x64" 481 + "\xd4\xfa\x7f\x93\x2c\xa6\x21\xc8" 482 + "\x7a\x23\x7b\xaa\x20\x56\x12\xae" 483 + "\x16\x9d\x94\x0f\x54\xa1\xec\xca" 484 + "\x51\x4e\xf2\x39\xf4\xf8\x5f\x04" 485 + "\x5a\x0d\xbf\xf5\x83\xa1\x15\xe1" 486 + "\xf5\x3c\xd8\x62\xa3\xed\x47\x89" 487 + "\x85\x4c\xe5\xdb\xac\x9e\x17\x1d" 488 + "\x0c\x09\xe3\x3e\x39\x5b\x4d\x74" 489 + "\x0e\xf5\x34\xee\x70\x11\x4c\xfd" 490 + "\xdb\x34\xb1\xb5\x10\x3f\x73\xb7" 491 + "\xf5\xfa\xed\xb0\x1f\xa5\xcd\x3c" 492 + "\x8d\x35\x83\xd4\x11\x44\x6e\x6c" 493 + "\x5b\xe0\x0e\x69\xa5\x39\xe5\xbb" 494 + "\xa9\x57\x24\x37\xe6\x1f\xdd\xcf" 495 + "\x16\x2a\x13\xf9\x6a\x2d\x90\xa0" 496 + "\x03\x60\x7a\xed\x69\xd5\x00\x8b" 497 + "\x7e\x4f\xcb\xb9\xfa\x91\xb9\x37" 498 + "\xc1\x26\xce\x90\x97\x22\x64\x64" 499 + "\xc1\x72\x43\x1b\xf6\xac\xc1\x54" 500 + "\x8a\x10\x9c\xdd\x8d\xd5\x8e\xb2" 501 + "\xe4\x85\xda\xe0\x20\x5f\xf4\xb4" 502 + "\x15\xb5\xa0\x8d\x12\x74\x49\x23" 503 + "\x3a\xdf\x4a\xd3\xf0\x3b\x89\xeb" 504 + "\xf8\xcc\x62\x7b\xfb\x93\x07\x41" 505 + "\x61\x26\x94\x58\x70\xa6\x3c\xe4" 506 + "\xff\x58\xc4\x13\x3d\xcb\x36\x6b" 507 + "\x32\xe5\xb2\x6d\x03\x74\x6f\x76" 508 + "\x93\x77\xde\x48\xc4\xfa\x30\x4a" 509 + "\xda\x49\x80\x77\x0f\x1c\xbe\x11" 510 + "\xc8\x48\xb1\xe5\xbb\xf2\x8a\xe1" 511 + "\x96\x2f\x9f\xd1\x8e\x8a\x5c\xe2" 512 + "\xf7\xd7\xd8\x54\xf3\x3f\xc4\x91" 513 + "\xb8\xfb\x86\xdc\x46\x24\x91\x60" 514 + "\x6c\x2f\xc9\x41\x37\x51\x49\x54" 515 + "\x09\x81\x21\xf3\x03\x9f\x2b\xe3" 516 + "\x1f\x39\x63\xaf\xf4\xd7\x53\x60" 517 + "\xa7\xc7\x54\xf9\xee\xb1\xb1\x7d" 518 + "\x75\x54\x65\x93\xfe\xb1\x68\x6b" 519 + "\x57\x02\xf9\xbb\x0e\xf9\xf8\xbf" 520 + "\x01\x12\x27\xb4\xfe\xe4\x79\x7a" 521 + "\x40\x5b\x51\x4b\xdf\x38\xec\xb1" 522 + "\x6a\x56\xff\x35\x4d\x42\x33\xaa" 523 + "\x6f\x1b\xe4\xdc\xe0\xdb\x85\x35" 524 + "\x62\x10\xd4\xec\xeb\xc5\x7e\x45" 525 + "\x1c\x6f\x17\xca\x3b\x8e\x2d\x66" 526 + "\x4f\x4b\x36\x56\xcd\x1b\x59\xaa" 527 + "\xd2\x9b\x17\xb9\x58\xdf\x7b\x64" 528 + "\x8a\xff\x3b\x9c\xa6\xb5\x48\x9e" 529 + "\xaa\xe2\x5d\x09\x71\x32\x5f\xb6" 530 + "\x29\xbe\xe7\xc7\x52\x7e\x91\x82" 531 + "\x6b\x6d\x33\xe1\x34\x06\x36\x21" 532 + "\x5e\xbe\x1e\x2f\x3e\xc1\xfb\xea" 533 + "\x49\x2c\xb5\xca\xf7\xb0\x37\xea" 534 + "\x1f\xed\x10\x04\xd9\x48\x0d\x1a" 535 + "\x1c\xfb\xe7\x84\x0e\x83\x53\x74" 536 + "\xc7\x65\xe2\x5c\xe5\xba\x73\x4c" 537 + "\x0e\xe1\xb5\x11\x45\x61\x43\x46" 538 + "\xaa\x25\x8f\xbd\x85\x08\xfa\x4c" 539 + "\x15\xc1\xc0\xd8\xf5\xdc\x16\xbb" 540 + "\x7b\x1d\xe3\x87\x57\xa7\x2a\x1d" 541 + "\x38\x58\x9e\x8a\x43\xdc\x57" 542 + "\xd1\x81\x7d\x2b\xe9\xff\x99\x3a" 543 + "\x4b\x24\x52\x58\x55\xe1\x49\x14"; 544 + 545 + static struct { 546 + const u8 *ptext; 547 + const u8 *ctext; 548 + 549 + u8 key[AES_MAX_KEY_SIZE]; 550 + u8 iv[GCM_AES_IV_SIZE]; 551 + u8 assoc[20]; 552 + 553 + int klen; 554 + int clen; 555 + int plen; 556 + int alen; 557 + } const aesgcm_tv[] __initconst = { 558 + { /* From McGrew & Viega - http://citeseer.ist.psu.edu/656989.html */ 559 + .klen = 16, 560 + .ctext = ctext0, 561 + .clen = sizeof(ctext0), 562 + }, { 563 + .klen = 16, 564 + .ptext = ptext1, 565 + .plen = sizeof(ptext1), 566 + .ctext = ctext1, 567 + .clen = sizeof(ctext1), 568 + }, { 569 + .key = "\xfe\xff\xe9\x92\x86\x65\x73\x1c" 570 + "\x6d\x6a\x8f\x94\x67\x30\x83\x08", 571 + .klen = 16, 572 + .iv = "\xca\xfe\xba\xbe\xfa\xce\xdb\xad" 573 + "\xde\xca\xf8\x88", 574 + .ptext = ptext2, 575 + .plen = sizeof(ptext2), 576 + .ctext = ctext2, 577 + .clen = sizeof(ctext2), 578 + }, { 579 + .key = "\xfe\xff\xe9\x92\x86\x65\x73\x1c" 580 + "\x6d\x6a\x8f\x94\x67\x30\x83\x08", 581 + .klen = 16, 582 + .iv = "\xca\xfe\xba\xbe\xfa\xce\xdb\xad" 583 + "\xde\xca\xf8\x88", 584 + .ptext = ptext3, 585 + .plen = sizeof(ptext3), 586 + .assoc = "\xfe\xed\xfa\xce\xde\xad\xbe\xef" 587 + "\xfe\xed\xfa\xce\xde\xad\xbe\xef" 588 + "\xab\xad\xda\xd2", 589 + .alen = 20, 590 + .ctext = ctext3, 591 + .clen = sizeof(ctext3), 592 + }, { 593 + .klen = 24, 594 + .ctext = ctext4, 595 + .clen = sizeof(ctext4), 596 + }, { 597 + .klen = 24, 598 + .ptext = ptext1, 599 + .plen = sizeof(ptext1), 600 + .ctext = ctext5, 601 + .clen = sizeof(ctext5), 602 + }, { 603 + .key = "\xfe\xff\xe9\x92\x86\x65\x73\x1c" 604 + "\x6d\x6a\x8f\x94\x67\x30\x83\x08" 605 + "\xfe\xff\xe9\x92\x86\x65\x73\x1c", 606 + .klen = 24, 607 + .iv = "\xca\xfe\xba\xbe\xfa\xce\xdb\xad" 608 + "\xde\xca\xf8\x88", 609 + .ptext = ptext6, 610 + .plen = sizeof(ptext6), 611 + .ctext = ctext6, 612 + .clen = sizeof(ctext6), 613 + }, { 614 + .klen = 32, 615 + .ctext = ctext7, 616 + .clen = sizeof(ctext7), 617 + }, { 618 + .klen = 32, 619 + .ptext = ptext1, 620 + .plen = sizeof(ptext1), 621 + .ctext = ctext8, 622 + .clen = sizeof(ctext8), 623 + }, { 624 + .key = "\xfe\xff\xe9\x92\x86\x65\x73\x1c" 625 + "\x6d\x6a\x8f\x94\x67\x30\x83\x08" 626 + "\xfe\xff\xe9\x92\x86\x65\x73\x1c" 627 + "\x6d\x6a\x8f\x94\x67\x30\x83\x08", 628 + .klen = 32, 629 + .iv = "\xca\xfe\xba\xbe\xfa\xce\xdb\xad" 630 + "\xde\xca\xf8\x88", 631 + .ptext = ptext9, 632 + .plen = sizeof(ptext9), 633 + .ctext = ctext9, 634 + .clen = sizeof(ctext9), 635 + }, { 636 + .key = "\xfe\xff\xe9\x92\x86\x65\x73\x1c" 637 + "\x6d\x6a\x8f\x94\x67\x30\x83\x08" 638 + "\xfe\xff\xe9\x92\x86\x65\x73\x1c" 639 + "\x6d\x6a\x8f\x94\x67\x30\x83\x08", 640 + .klen = 32, 641 + .iv = "\xca\xfe\xba\xbe\xfa\xce\xdb\xad" 642 + "\xde\xca\xf8\x88", 643 + .ptext = ptext10, 644 + .plen = sizeof(ptext10), 645 + .assoc = "\xfe\xed\xfa\xce\xde\xad\xbe\xef" 646 + "\xfe\xed\xfa\xce\xde\xad\xbe\xef" 647 + "\xab\xad\xda\xd2", 648 + .alen = 20, 649 + .ctext = ctext10, 650 + .clen = sizeof(ctext10), 651 + }, { 652 + .key = "\xfe\xff\xe9\x92\x86\x65\x73\x1c" 653 + "\x6d\x6a\x8f\x94\x67\x30\x83\x08" 654 + "\xfe\xff\xe9\x92\x86\x65\x73\x1c", 655 + .klen = 24, 656 + .iv = "\xca\xfe\xba\xbe\xfa\xce\xdb\xad" 657 + "\xde\xca\xf8\x88", 658 + .ptext = ptext11, 659 + .plen = sizeof(ptext11), 660 + .assoc = "\xfe\xed\xfa\xce\xde\xad\xbe\xef" 661 + "\xfe\xed\xfa\xce\xde\xad\xbe\xef" 662 + "\xab\xad\xda\xd2", 663 + .alen = 20, 664 + .ctext = ctext11, 665 + .clen = sizeof(ctext11), 666 + }, { 667 + .key = "\x62\x35\xf8\x95\xfc\xa5\xeb\xf6" 668 + "\x0e\x92\x12\x04\xd3\xa1\x3f\x2e" 669 + "\x8b\x32\xcf\xe7\x44\xed\x13\x59" 670 + "\x04\x38\x77\xb0\xb9\xad\xb4\x38", 671 + .klen = 32, 672 + .iv = "\x00\xff\xff\xff\xff\x00\x00\xff" 673 + "\xff\xff\x00\xff", 674 + .ptext = ptext12, 675 + .plen = sizeof(ptext12), 676 + .ctext = ctext12, 677 + .clen = sizeof(ctext12), 678 + } 679 + }; 680 + 681 + static int __init libaesgcm_init(void) 682 + { 683 + for (int i = 0; i < ARRAY_SIZE(aesgcm_tv); i++) { 684 + u8 tagbuf[AES_BLOCK_SIZE]; 685 + int plen = aesgcm_tv[i].plen; 686 + struct aesgcm_ctx ctx; 687 + u8 buf[sizeof(ptext12)]; 688 + 689 + if (aesgcm_expandkey(&ctx, aesgcm_tv[i].key, aesgcm_tv[i].klen, 690 + aesgcm_tv[i].clen - plen)) { 691 + pr_err("aesgcm_expandkey() failed on vector %d\n", i); 692 + return -ENODEV; 693 + } 694 + 695 + if (!aesgcm_decrypt(&ctx, buf, aesgcm_tv[i].ctext, plen, 696 + aesgcm_tv[i].assoc, aesgcm_tv[i].alen, 697 + aesgcm_tv[i].iv, aesgcm_tv[i].ctext + plen) 698 + || memcmp(buf, aesgcm_tv[i].ptext, plen)) { 699 + pr_err("aesgcm_decrypt() #1 failed on vector %d\n", i); 700 + return -ENODEV; 701 + } 702 + 703 + /* encrypt in place */ 704 + aesgcm_encrypt(&ctx, buf, buf, plen, aesgcm_tv[i].assoc, 705 + aesgcm_tv[i].alen, aesgcm_tv[i].iv, tagbuf); 706 + if (memcmp(buf, aesgcm_tv[i].ctext, plen)) { 707 + pr_err("aesgcm_encrypt() failed on vector %d\n", i); 708 + return -ENODEV; 709 + } 710 + 711 + /* decrypt in place */ 712 + if (!aesgcm_decrypt(&ctx, buf, buf, plen, aesgcm_tv[i].assoc, 713 + aesgcm_tv[i].alen, aesgcm_tv[i].iv, tagbuf) 714 + || memcmp(buf, aesgcm_tv[i].ptext, plen)) { 715 + pr_err("aesgcm_decrypt() #2 failed on vector %d\n", i); 716 + return -ENODEV; 717 + } 718 + } 719 + return 0; 720 + } 721 + module_init(libaesgcm_init); 722 + 723 + static void __exit libaesgcm_exit(void) 724 + { 725 + } 726 + module_exit(libaesgcm_exit); 727 + #endif