Home | History | Annotate | Download | only in modes
      1 /* ====================================================================
      2  * Copyright (c) 2010 The OpenSSL Project.  All rights reserved.
      3  *
      4  * Redistribution and use in source and binary forms, with or without
      5  * modification, are permitted provided that the following conditions
      6  * are met:
      7  *
      8  * 1. Redistributions of source code must retain the above copyright
      9  *    notice, this list of conditions and the following disclaimer.
     10  *
     11  * 2. Redistributions in binary form must reproduce the above copyright
     12  *    notice, this list of conditions and the following disclaimer in
     13  *    the documentation and/or other materials provided with the
     14  *    distribution.
     15  *
     16  * 3. All advertising materials mentioning features or use of this
     17  *    software must display the following acknowledgment:
     18  *    "This product includes software developed by the OpenSSL Project
     19  *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
     20  *
     21  * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
     22  *    endorse or promote products derived from this software without
     23  *    prior written permission. For written permission, please contact
     24  *    openssl-core (at) openssl.org.
     25  *
     26  * 5. Products derived from this software may not be called "OpenSSL"
     27  *    nor may "OpenSSL" appear in their names without prior written
     28  *    permission of the OpenSSL Project.
     29  *
     30  * 6. Redistributions of any form whatsoever must retain the following
     31  *    acknowledgment:
     32  *    "This product includes software developed by the OpenSSL Project
     33  *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
     34  *
     35  * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
     36  * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     37  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     38  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
     39  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     40  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     41  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
     42  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     43  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
     44  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     45  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
     46  * OF THE POSSIBILITY OF SUCH DAMAGE.
     47  * ====================================================================
     48  */
     49 
     50 #define OPENSSL_FIPSAPI
     51 
     52 #include <openssl/crypto.h>
     53 #include "modes_lcl.h"
     54 #include <string.h>
     55 
     56 #ifndef MODES_DEBUG
     57 # ifndef NDEBUG
     58 #  define NDEBUG
     59 # endif
     60 #endif
     61 #include <assert.h>
     62 
     63 #if defined(BSWAP4) && defined(STRICT_ALIGNMENT)
     64 /* redefine, because alignment is ensured */
     65 #undef	GETU32
     66 #define	GETU32(p)	BSWAP4(*(const u32 *)(p))
     67 #undef	PUTU32
     68 #define	PUTU32(p,v)	*(u32 *)(p) = BSWAP4(v)
     69 #endif
     70 
     71 #define	PACK(s)		((size_t)(s)<<(sizeof(size_t)*8-16))
     72 #define REDUCE1BIT(V)	do { \
     73 	if (sizeof(size_t)==8) { \
     74 		u64 T = U64(0xe100000000000000) & (0-(V.lo&1)); \
     75 		V.lo  = (V.hi<<63)|(V.lo>>1); \
     76 		V.hi  = (V.hi>>1 )^T; \
     77 	} \
     78 	else { \
     79 		u32 T = 0xe1000000U & (0-(u32)(V.lo&1)); \
     80 		V.lo  = (V.hi<<63)|(V.lo>>1); \
     81 		V.hi  = (V.hi>>1 )^((u64)T<<32); \
     82 	} \
     83 } while(0)
     84 
     85 /*
     86  * Even though permitted values for TABLE_BITS are 8, 4 and 1, it should
     87  * never be set to 8. 8 is effectively reserved for testing purposes.
     88  * TABLE_BITS>1 are lookup-table-driven implementations referred to as
     89  * "Shoup's" in GCM specification. In other words OpenSSL does not cover
     90  * whole spectrum of possible table driven implementations. Why? In
     91  * non-"Shoup's" case memory access pattern is segmented in such manner,
     92  * that it's trivial to see that cache timing information can reveal
     93  * fair portion of intermediate hash value. Given that ciphertext is
     94  * always available to attacker, it's possible for him to attempt to
     95  * deduce secret parameter H and if successful, tamper with messages
     96  * [which is nothing but trivial in CTR mode]. In "Shoup's" case it's
     97  * not as trivial, but there is no reason to believe that it's resistant
     98  * to cache-timing attack. And the thing about "8-bit" implementation is
     99  * that it consumes 16 (sixteen) times more memory, 4KB per individual
    100  * key + 1KB shared. Well, on pros side it should be twice as fast as
    101  * "4-bit" version. And for gcc-generated x86[_64] code, "8-bit" version
    102  * was observed to run ~75% faster, closer to 100% for commercial
    103  * compilers... Yet "4-bit" procedure is preferred, because it's
    104  * believed to provide better security-performance balance and adequate
    105  * all-round performance. "All-round" refers to things like:
    106  *
    107  * - shorter setup time effectively improves overall timing for
    108  *   handling short messages;
    109  * - larger table allocation can become unbearable because of VM
    110  *   subsystem penalties (for example on Windows large enough free
    111  *   results in VM working set trimming, meaning that consequent
    112  *   malloc would immediately incur working set expansion);
    113  * - larger table has larger cache footprint, which can affect
    114  *   performance of other code paths (not necessarily even from same
    115  *   thread in Hyper-Threading world);
    116  *
    117  * Value of 1 is not appropriate for performance reasons.
    118  */
    119 #if	TABLE_BITS==8
    120 
    121 static void gcm_init_8bit(u128 Htable[256], u64 H[2])
    122 {
    123 	int  i, j;
    124 	u128 V;
    125 
    126 	Htable[0].hi = 0;
    127 	Htable[0].lo = 0;
    128 	V.hi = H[0];
    129 	V.lo = H[1];
    130 
    131 	for (Htable[128]=V, i=64; i>0; i>>=1) {
    132 		REDUCE1BIT(V);
    133 		Htable[i] = V;
    134 	}
    135 
    136 	for (i=2; i<256; i<<=1) {
    137 		u128 *Hi = Htable+i, H0 = *Hi;
    138 		for (j=1; j<i; ++j) {
    139 			Hi[j].hi = H0.hi^Htable[j].hi;
    140 			Hi[j].lo = H0.lo^Htable[j].lo;
    141 		}
    142 	}
    143 }
    144 
    145 static void gcm_gmult_8bit(u64 Xi[2], const u128 Htable[256])
    146 {
    147 	u128 Z = { 0, 0};
    148 	const u8 *xi = (const u8 *)Xi+15;
    149 	size_t rem, n = *xi;
    150 	const union { long one; char little; } is_endian = {1};
    151 	static const size_t rem_8bit[256] = {
    152 		PACK(0x0000), PACK(0x01C2), PACK(0x0384), PACK(0x0246),
    153 		PACK(0x0708), PACK(0x06CA), PACK(0x048C), PACK(0x054E),
    154 		PACK(0x0E10), PACK(0x0FD2), PACK(0x0D94), PACK(0x0C56),
    155 		PACK(0x0918), PACK(0x08DA), PACK(0x0A9C), PACK(0x0B5E),
    156 		PACK(0x1C20), PACK(0x1DE2), PACK(0x1FA4), PACK(0x1E66),
    157 		PACK(0x1B28), PACK(0x1AEA), PACK(0x18AC), PACK(0x196E),
    158 		PACK(0x1230), PACK(0x13F2), PACK(0x11B4), PACK(0x1076),
    159 		PACK(0x1538), PACK(0x14FA), PACK(0x16BC), PACK(0x177E),
    160 		PACK(0x3840), PACK(0x3982), PACK(0x3BC4), PACK(0x3A06),
    161 		PACK(0x3F48), PACK(0x3E8A), PACK(0x3CCC), PACK(0x3D0E),
    162 		PACK(0x3650), PACK(0x3792), PACK(0x35D4), PACK(0x3416),
    163 		PACK(0x3158), PACK(0x309A), PACK(0x32DC), PACK(0x331E),
    164 		PACK(0x2460), PACK(0x25A2), PACK(0x27E4), PACK(0x2626),
    165 		PACK(0x2368), PACK(0x22AA), PACK(0x20EC), PACK(0x212E),
    166 		PACK(0x2A70), PACK(0x2BB2), PACK(0x29F4), PACK(0x2836),
    167 		PACK(0x2D78), PACK(0x2CBA), PACK(0x2EFC), PACK(0x2F3E),
    168 		PACK(0x7080), PACK(0x7142), PACK(0x7304), PACK(0x72C6),
    169 		PACK(0x7788), PACK(0x764A), PACK(0x740C), PACK(0x75CE),
    170 		PACK(0x7E90), PACK(0x7F52), PACK(0x7D14), PACK(0x7CD6),
    171 		PACK(0x7998), PACK(0x785A), PACK(0x7A1C), PACK(0x7BDE),
    172 		PACK(0x6CA0), PACK(0x6D62), PACK(0x6F24), PACK(0x6EE6),
    173 		PACK(0x6BA8), PACK(0x6A6A), PACK(0x682C), PACK(0x69EE),
    174 		PACK(0x62B0), PACK(0x6372), PACK(0x6134), PACK(0x60F6),
    175 		PACK(0x65B8), PACK(0x647A), PACK(0x663C), PACK(0x67FE),
    176 		PACK(0x48C0), PACK(0x4902), PACK(0x4B44), PACK(0x4A86),
    177 		PACK(0x4FC8), PACK(0x4E0A), PACK(0x4C4C), PACK(0x4D8E),
    178 		PACK(0x46D0), PACK(0x4712), PACK(0x4554), PACK(0x4496),
    179 		PACK(0x41D8), PACK(0x401A), PACK(0x425C), PACK(0x439E),
    180 		PACK(0x54E0), PACK(0x5522), PACK(0x5764), PACK(0x56A6),
    181 		PACK(0x53E8), PACK(0x522A), PACK(0x506C), PACK(0x51AE),
    182 		PACK(0x5AF0), PACK(0x5B32), PACK(0x5974), PACK(0x58B6),
    183 		PACK(0x5DF8), PACK(0x5C3A), PACK(0x5E7C), PACK(0x5FBE),
    184 		PACK(0xE100), PACK(0xE0C2), PACK(0xE284), PACK(0xE346),
    185 		PACK(0xE608), PACK(0xE7CA), PACK(0xE58C), PACK(0xE44E),
    186 		PACK(0xEF10), PACK(0xEED2), PACK(0xEC94), PACK(0xED56),
    187 		PACK(0xE818), PACK(0xE9DA), PACK(0xEB9C), PACK(0xEA5E),
    188 		PACK(0xFD20), PACK(0xFCE2), PACK(0xFEA4), PACK(0xFF66),
    189 		PACK(0xFA28), PACK(0xFBEA), PACK(0xF9AC), PACK(0xF86E),
    190 		PACK(0xF330), PACK(0xF2F2), PACK(0xF0B4), PACK(0xF176),
    191 		PACK(0xF438), PACK(0xF5FA), PACK(0xF7BC), PACK(0xF67E),
    192 		PACK(0xD940), PACK(0xD882), PACK(0xDAC4), PACK(0xDB06),
    193 		PACK(0xDE48), PACK(0xDF8A), PACK(0xDDCC), PACK(0xDC0E),
    194 		PACK(0xD750), PACK(0xD692), PACK(0xD4D4), PACK(0xD516),
    195 		PACK(0xD058), PACK(0xD19A), PACK(0xD3DC), PACK(0xD21E),
    196 		PACK(0xC560), PACK(0xC4A2), PACK(0xC6E4), PACK(0xC726),
    197 		PACK(0xC268), PACK(0xC3AA), PACK(0xC1EC), PACK(0xC02E),
    198 		PACK(0xCB70), PACK(0xCAB2), PACK(0xC8F4), PACK(0xC936),
    199 		PACK(0xCC78), PACK(0xCDBA), PACK(0xCFFC), PACK(0xCE3E),
    200 		PACK(0x9180), PACK(0x9042), PACK(0x9204), PACK(0x93C6),
    201 		PACK(0x9688), PACK(0x974A), PACK(0x950C), PACK(0x94CE),
    202 		PACK(0x9F90), PACK(0x9E52), PACK(0x9C14), PACK(0x9DD6),
    203 		PACK(0x9898), PACK(0x995A), PACK(0x9B1C), PACK(0x9ADE),
    204 		PACK(0x8DA0), PACK(0x8C62), PACK(0x8E24), PACK(0x8FE6),
    205 		PACK(0x8AA8), PACK(0x8B6A), PACK(0x892C), PACK(0x88EE),
    206 		PACK(0x83B0), PACK(0x8272), PACK(0x8034), PACK(0x81F6),
    207 		PACK(0x84B8), PACK(0x857A), PACK(0x873C), PACK(0x86FE),
    208 		PACK(0xA9C0), PACK(0xA802), PACK(0xAA44), PACK(0xAB86),
    209 		PACK(0xAEC8), PACK(0xAF0A), PACK(0xAD4C), PACK(0xAC8E),
    210 		PACK(0xA7D0), PACK(0xA612), PACK(0xA454), PACK(0xA596),
    211 		PACK(0xA0D8), PACK(0xA11A), PACK(0xA35C), PACK(0xA29E),
    212 		PACK(0xB5E0), PACK(0xB422), PACK(0xB664), PACK(0xB7A6),
    213 		PACK(0xB2E8), PACK(0xB32A), PACK(0xB16C), PACK(0xB0AE),
    214 		PACK(0xBBF0), PACK(0xBA32), PACK(0xB874), PACK(0xB9B6),
    215 		PACK(0xBCF8), PACK(0xBD3A), PACK(0xBF7C), PACK(0xBEBE) };
    216 
    217 	while (1) {
    218 		Z.hi ^= Htable[n].hi;
    219 		Z.lo ^= Htable[n].lo;
    220 
    221 		if ((u8 *)Xi==xi)	break;
    222 
    223 		n = *(--xi);
    224 
    225 		rem  = (size_t)Z.lo&0xff;
    226 		Z.lo = (Z.hi<<56)|(Z.lo>>8);
    227 		Z.hi = (Z.hi>>8);
    228 		if (sizeof(size_t)==8)
    229 			Z.hi ^= rem_8bit[rem];
    230 		else
    231 			Z.hi ^= (u64)rem_8bit[rem]<<32;
    232 	}
    233 
    234 	if (is_endian.little) {
    235 #ifdef BSWAP8
    236 		Xi[0] = BSWAP8(Z.hi);
    237 		Xi[1] = BSWAP8(Z.lo);
    238 #else
    239 		u8 *p = (u8 *)Xi;
    240 		u32 v;
    241 		v = (u32)(Z.hi>>32);	PUTU32(p,v);
    242 		v = (u32)(Z.hi);	PUTU32(p+4,v);
    243 		v = (u32)(Z.lo>>32);	PUTU32(p+8,v);
    244 		v = (u32)(Z.lo);	PUTU32(p+12,v);
    245 #endif
    246 	}
    247 	else {
    248 		Xi[0] = Z.hi;
    249 		Xi[1] = Z.lo;
    250 	}
    251 }
    252 #define GCM_MUL(ctx,Xi)   gcm_gmult_8bit(ctx->Xi.u,ctx->Htable)
    253 
    254 #elif	TABLE_BITS==4
    255 
    256 static void gcm_init_4bit(u128 Htable[16], u64 H[2])
    257 {
    258 	u128 V;
    259 #if defined(OPENSSL_SMALL_FOOTPRINT)
    260 	int  i;
    261 #endif
    262 
    263 	Htable[0].hi = 0;
    264 	Htable[0].lo = 0;
    265 	V.hi = H[0];
    266 	V.lo = H[1];
    267 
    268 #if defined(OPENSSL_SMALL_FOOTPRINT)
    269 	for (Htable[8]=V, i=4; i>0; i>>=1) {
    270 		REDUCE1BIT(V);
    271 		Htable[i] = V;
    272 	}
    273 
    274 	for (i=2; i<16; i<<=1) {
    275 		u128 *Hi = Htable+i;
    276 		int   j;
    277 		for (V=*Hi, j=1; j<i; ++j) {
    278 			Hi[j].hi = V.hi^Htable[j].hi;
    279 			Hi[j].lo = V.lo^Htable[j].lo;
    280 		}
    281 	}
    282 #else
    283 	Htable[8] = V;
    284 	REDUCE1BIT(V);
    285 	Htable[4] = V;
    286 	REDUCE1BIT(V);
    287 	Htable[2] = V;
    288 	REDUCE1BIT(V);
    289 	Htable[1] = V;
    290 	Htable[3].hi  = V.hi^Htable[2].hi, Htable[3].lo  = V.lo^Htable[2].lo;
    291 	V=Htable[4];
    292 	Htable[5].hi  = V.hi^Htable[1].hi, Htable[5].lo  = V.lo^Htable[1].lo;
    293 	Htable[6].hi  = V.hi^Htable[2].hi, Htable[6].lo  = V.lo^Htable[2].lo;
    294 	Htable[7].hi  = V.hi^Htable[3].hi, Htable[7].lo  = V.lo^Htable[3].lo;
    295 	V=Htable[8];
    296 	Htable[9].hi  = V.hi^Htable[1].hi, Htable[9].lo  = V.lo^Htable[1].lo;
    297 	Htable[10].hi = V.hi^Htable[2].hi, Htable[10].lo = V.lo^Htable[2].lo;
    298 	Htable[11].hi = V.hi^Htable[3].hi, Htable[11].lo = V.lo^Htable[3].lo;
    299 	Htable[12].hi = V.hi^Htable[4].hi, Htable[12].lo = V.lo^Htable[4].lo;
    300 	Htable[13].hi = V.hi^Htable[5].hi, Htable[13].lo = V.lo^Htable[5].lo;
    301 	Htable[14].hi = V.hi^Htable[6].hi, Htable[14].lo = V.lo^Htable[6].lo;
    302 	Htable[15].hi = V.hi^Htable[7].hi, Htable[15].lo = V.lo^Htable[7].lo;
    303 #endif
    304 #if defined(GHASH_ASM) && (defined(__arm__) || defined(__arm))
    305 	/*
    306 	 * ARM assembler expects specific dword order in Htable.
    307 	 */
    308 	{
    309 	int j;
    310 	const union { long one; char little; } is_endian = {1};
    311 
    312 	if (is_endian.little)
    313 		for (j=0;j<16;++j) {
    314 			V = Htable[j];
    315 			Htable[j].hi = V.lo;
    316 			Htable[j].lo = V.hi;
    317 		}
    318 	else
    319 		for (j=0;j<16;++j) {
    320 			V = Htable[j];
    321 			Htable[j].hi = V.lo<<32|V.lo>>32;
    322 			Htable[j].lo = V.hi<<32|V.hi>>32;
    323 		}
    324 	}
    325 #endif
    326 }
    327 
    328 #ifndef GHASH_ASM
    329 static const size_t rem_4bit[16] = {
    330 	PACK(0x0000), PACK(0x1C20), PACK(0x3840), PACK(0x2460),
    331 	PACK(0x7080), PACK(0x6CA0), PACK(0x48C0), PACK(0x54E0),
    332 	PACK(0xE100), PACK(0xFD20), PACK(0xD940), PACK(0xC560),
    333 	PACK(0x9180), PACK(0x8DA0), PACK(0xA9C0), PACK(0xB5E0) };
    334 
    335 static void gcm_gmult_4bit(u64 Xi[2], const u128 Htable[16])
    336 {
    337 	u128 Z;
    338 	int cnt = 15;
    339 	size_t rem, nlo, nhi;
    340 	const union { long one; char little; } is_endian = {1};
    341 
    342 	nlo  = ((const u8 *)Xi)[15];
    343 	nhi  = nlo>>4;
    344 	nlo &= 0xf;
    345 
    346 	Z.hi = Htable[nlo].hi;
    347 	Z.lo = Htable[nlo].lo;
    348 
    349 	while (1) {
    350 		rem  = (size_t)Z.lo&0xf;
    351 		Z.lo = (Z.hi<<60)|(Z.lo>>4);
    352 		Z.hi = (Z.hi>>4);
    353 		if (sizeof(size_t)==8)
    354 			Z.hi ^= rem_4bit[rem];
    355 		else
    356 			Z.hi ^= (u64)rem_4bit[rem]<<32;
    357 
    358 		Z.hi ^= Htable[nhi].hi;
    359 		Z.lo ^= Htable[nhi].lo;
    360 
    361 		if (--cnt<0)		break;
    362 
    363 		nlo  = ((const u8 *)Xi)[cnt];
    364 		nhi  = nlo>>4;
    365 		nlo &= 0xf;
    366 
    367 		rem  = (size_t)Z.lo&0xf;
    368 		Z.lo = (Z.hi<<60)|(Z.lo>>4);
    369 		Z.hi = (Z.hi>>4);
    370 		if (sizeof(size_t)==8)
    371 			Z.hi ^= rem_4bit[rem];
    372 		else
    373 			Z.hi ^= (u64)rem_4bit[rem]<<32;
    374 
    375 		Z.hi ^= Htable[nlo].hi;
    376 		Z.lo ^= Htable[nlo].lo;
    377 	}
    378 
    379 	if (is_endian.little) {
    380 #ifdef BSWAP8
    381 		Xi[0] = BSWAP8(Z.hi);
    382 		Xi[1] = BSWAP8(Z.lo);
    383 #else
    384 		u8 *p = (u8 *)Xi;
    385 		u32 v;
    386 		v = (u32)(Z.hi>>32);	PUTU32(p,v);
    387 		v = (u32)(Z.hi);	PUTU32(p+4,v);
    388 		v = (u32)(Z.lo>>32);	PUTU32(p+8,v);
    389 		v = (u32)(Z.lo);	PUTU32(p+12,v);
    390 #endif
    391 	}
    392 	else {
    393 		Xi[0] = Z.hi;
    394 		Xi[1] = Z.lo;
    395 	}
    396 }
    397 
    398 #if !defined(OPENSSL_SMALL_FOOTPRINT)
    399 /*
    400  * Streamed gcm_mult_4bit, see CRYPTO_gcm128_[en|de]crypt for
    401  * details... Compiler-generated code doesn't seem to give any
    402  * performance improvement, at least not on x86[_64]. It's here
    403  * mostly as reference and a placeholder for possible future
    404  * non-trivial optimization[s]...
    405  */
    406 static void gcm_ghash_4bit(u64 Xi[2],const u128 Htable[16],
    407 				const u8 *inp,size_t len)
    408 {
    409     u128 Z;
    410     int cnt;
    411     size_t rem, nlo, nhi;
    412     const union { long one; char little; } is_endian = {1};
    413 
    414 #if 1
    415     do {
    416 	cnt  = 15;
    417 	nlo  = ((const u8 *)Xi)[15];
    418 	nlo ^= inp[15];
    419 	nhi  = nlo>>4;
    420 	nlo &= 0xf;
    421 
    422 	Z.hi = Htable[nlo].hi;
    423 	Z.lo = Htable[nlo].lo;
    424 
    425 	while (1) {
    426 		rem  = (size_t)Z.lo&0xf;
    427 		Z.lo = (Z.hi<<60)|(Z.lo>>4);
    428 		Z.hi = (Z.hi>>4);
    429 		if (sizeof(size_t)==8)
    430 			Z.hi ^= rem_4bit[rem];
    431 		else
    432 			Z.hi ^= (u64)rem_4bit[rem]<<32;
    433 
    434 		Z.hi ^= Htable[nhi].hi;
    435 		Z.lo ^= Htable[nhi].lo;
    436 
    437 		if (--cnt<0)		break;
    438 
    439 		nlo  = ((const u8 *)Xi)[cnt];
    440 		nlo ^= inp[cnt];
    441 		nhi  = nlo>>4;
    442 		nlo &= 0xf;
    443 
    444 		rem  = (size_t)Z.lo&0xf;
    445 		Z.lo = (Z.hi<<60)|(Z.lo>>4);
    446 		Z.hi = (Z.hi>>4);
    447 		if (sizeof(size_t)==8)
    448 			Z.hi ^= rem_4bit[rem];
    449 		else
    450 			Z.hi ^= (u64)rem_4bit[rem]<<32;
    451 
    452 		Z.hi ^= Htable[nlo].hi;
    453 		Z.lo ^= Htable[nlo].lo;
    454 	}
    455 #else
    456     /*
    457      * Extra 256+16 bytes per-key plus 512 bytes shared tables
    458      * [should] give ~50% improvement... One could have PACK()-ed
    459      * the rem_8bit even here, but the priority is to minimize
    460      * cache footprint...
    461      */
    462     u128 Hshr4[16];	/* Htable shifted right by 4 bits */
    463     u8   Hshl4[16];	/* Htable shifted left  by 4 bits */
    464     static const unsigned short rem_8bit[256] = {
    465 	0x0000, 0x01C2, 0x0384, 0x0246, 0x0708, 0x06CA, 0x048C, 0x054E,
    466 	0x0E10, 0x0FD2, 0x0D94, 0x0C56, 0x0918, 0x08DA, 0x0A9C, 0x0B5E,
    467 	0x1C20, 0x1DE2, 0x1FA4, 0x1E66, 0x1B28, 0x1AEA, 0x18AC, 0x196E,
    468 	0x1230, 0x13F2, 0x11B4, 0x1076, 0x1538, 0x14FA, 0x16BC, 0x177E,
    469 	0x3840, 0x3982, 0x3BC4, 0x3A06, 0x3F48, 0x3E8A, 0x3CCC, 0x3D0E,
    470 	0x3650, 0x3792, 0x35D4, 0x3416, 0x3158, 0x309A, 0x32DC, 0x331E,
    471 	0x2460, 0x25A2, 0x27E4, 0x2626, 0x2368, 0x22AA, 0x20EC, 0x212E,
    472 	0x2A70, 0x2BB2, 0x29F4, 0x2836, 0x2D78, 0x2CBA, 0x2EFC, 0x2F3E,
    473 	0x7080, 0x7142, 0x7304, 0x72C6, 0x7788, 0x764A, 0x740C, 0x75CE,
    474 	0x7E90, 0x7F52, 0x7D14, 0x7CD6, 0x7998, 0x785A, 0x7A1C, 0x7BDE,
    475 	0x6CA0, 0x6D62, 0x6F24, 0x6EE6, 0x6BA8, 0x6A6A, 0x682C, 0x69EE,
    476 	0x62B0, 0x6372, 0x6134, 0x60F6, 0x65B8, 0x647A, 0x663C, 0x67FE,
    477 	0x48C0, 0x4902, 0x4B44, 0x4A86, 0x4FC8, 0x4E0A, 0x4C4C, 0x4D8E,
    478 	0x46D0, 0x4712, 0x4554, 0x4496, 0x41D8, 0x401A, 0x425C, 0x439E,
    479 	0x54E0, 0x5522, 0x5764, 0x56A6, 0x53E8, 0x522A, 0x506C, 0x51AE,
    480 	0x5AF0, 0x5B32, 0x5974, 0x58B6, 0x5DF8, 0x5C3A, 0x5E7C, 0x5FBE,
    481 	0xE100, 0xE0C2, 0xE284, 0xE346, 0xE608, 0xE7CA, 0xE58C, 0xE44E,
    482 	0xEF10, 0xEED2, 0xEC94, 0xED56, 0xE818, 0xE9DA, 0xEB9C, 0xEA5E,
    483 	0xFD20, 0xFCE2, 0xFEA4, 0xFF66, 0xFA28, 0xFBEA, 0xF9AC, 0xF86E,
    484 	0xF330, 0xF2F2, 0xF0B4, 0xF176, 0xF438, 0xF5FA, 0xF7BC, 0xF67E,
    485 	0xD940, 0xD882, 0xDAC4, 0xDB06, 0xDE48, 0xDF8A, 0xDDCC, 0xDC0E,
    486 	0xD750, 0xD692, 0xD4D4, 0xD516, 0xD058, 0xD19A, 0xD3DC, 0xD21E,
    487 	0xC560, 0xC4A2, 0xC6E4, 0xC726, 0xC268, 0xC3AA, 0xC1EC, 0xC02E,
    488 	0xCB70, 0xCAB2, 0xC8F4, 0xC936, 0xCC78, 0xCDBA, 0xCFFC, 0xCE3E,
    489 	0x9180, 0x9042, 0x9204, 0x93C6, 0x9688, 0x974A, 0x950C, 0x94CE,
    490 	0x9F90, 0x9E52, 0x9C14, 0x9DD6, 0x9898, 0x995A, 0x9B1C, 0x9ADE,
    491 	0x8DA0, 0x8C62, 0x8E24, 0x8FE6, 0x8AA8, 0x8B6A, 0x892C, 0x88EE,
    492 	0x83B0, 0x8272, 0x8034, 0x81F6, 0x84B8, 0x857A, 0x873C, 0x86FE,
    493 	0xA9C0, 0xA802, 0xAA44, 0xAB86, 0xAEC8, 0xAF0A, 0xAD4C, 0xAC8E,
    494 	0xA7D0, 0xA612, 0xA454, 0xA596, 0xA0D8, 0xA11A, 0xA35C, 0xA29E,
    495 	0xB5E0, 0xB422, 0xB664, 0xB7A6, 0xB2E8, 0xB32A, 0xB16C, 0xB0AE,
    496 	0xBBF0, 0xBA32, 0xB874, 0xB9B6, 0xBCF8, 0xBD3A, 0xBF7C, 0xBEBE };
    497     /*
    498      * This pre-processing phase slows down procedure by approximately
    499      * same time as it makes each loop spin faster. In other words
    500      * single block performance is approximately same as straightforward
    501      * "4-bit" implementation, and then it goes only faster...
    502      */
    503     for (cnt=0; cnt<16; ++cnt) {
    504 	Z.hi = Htable[cnt].hi;
    505 	Z.lo = Htable[cnt].lo;
    506 	Hshr4[cnt].lo = (Z.hi<<60)|(Z.lo>>4);
    507 	Hshr4[cnt].hi = (Z.hi>>4);
    508 	Hshl4[cnt]    = (u8)(Z.lo<<4);
    509     }
    510 
    511     do {
    512 	for (Z.lo=0, Z.hi=0, cnt=15; cnt; --cnt) {
    513 		nlo  = ((const u8 *)Xi)[cnt];
    514 		nlo ^= inp[cnt];
    515 		nhi  = nlo>>4;
    516 		nlo &= 0xf;
    517 
    518 		Z.hi ^= Htable[nlo].hi;
    519 		Z.lo ^= Htable[nlo].lo;
    520 
    521 		rem = (size_t)Z.lo&0xff;
    522 
    523 		Z.lo = (Z.hi<<56)|(Z.lo>>8);
    524 		Z.hi = (Z.hi>>8);
    525 
    526 		Z.hi ^= Hshr4[nhi].hi;
    527 		Z.lo ^= Hshr4[nhi].lo;
    528 		Z.hi ^= (u64)rem_8bit[rem^Hshl4[nhi]]<<48;
    529 	}
    530 
    531 	nlo  = ((const u8 *)Xi)[0];
    532 	nlo ^= inp[0];
    533 	nhi  = nlo>>4;
    534 	nlo &= 0xf;
    535 
    536 	Z.hi ^= Htable[nlo].hi;
    537 	Z.lo ^= Htable[nlo].lo;
    538 
    539 	rem = (size_t)Z.lo&0xf;
    540 
    541 	Z.lo = (Z.hi<<60)|(Z.lo>>4);
    542 	Z.hi = (Z.hi>>4);
    543 
    544 	Z.hi ^= Htable[nhi].hi;
    545 	Z.lo ^= Htable[nhi].lo;
    546 	Z.hi ^= ((u64)rem_8bit[rem<<4])<<48;
    547 #endif
    548 
    549 	if (is_endian.little) {
    550 #ifdef BSWAP8
    551 		Xi[0] = BSWAP8(Z.hi);
    552 		Xi[1] = BSWAP8(Z.lo);
    553 #else
    554 		u8 *p = (u8 *)Xi;
    555 		u32 v;
    556 		v = (u32)(Z.hi>>32);	PUTU32(p,v);
    557 		v = (u32)(Z.hi);	PUTU32(p+4,v);
    558 		v = (u32)(Z.lo>>32);	PUTU32(p+8,v);
    559 		v = (u32)(Z.lo);	PUTU32(p+12,v);
    560 #endif
    561 	}
    562 	else {
    563 		Xi[0] = Z.hi;
    564 		Xi[1] = Z.lo;
    565 	}
    566     } while (inp+=16, len-=16);
    567 }
    568 #endif
    569 #else
    570 void gcm_gmult_4bit(u64 Xi[2],const u128 Htable[16]);
    571 void gcm_ghash_4bit(u64 Xi[2],const u128 Htable[16],const u8 *inp,size_t len);
    572 #endif
    573 
    574 #define GCM_MUL(ctx,Xi)   gcm_gmult_4bit(ctx->Xi.u,ctx->Htable)
    575 #if defined(GHASH_ASM) || !defined(OPENSSL_SMALL_FOOTPRINT)
    576 #define GHASH(ctx,in,len) gcm_ghash_4bit((ctx)->Xi.u,(ctx)->Htable,in,len)
    577 /* GHASH_CHUNK is "stride parameter" missioned to mitigate cache
    578  * trashing effect. In other words idea is to hash data while it's
    579  * still in L1 cache after encryption pass... */
    580 #define GHASH_CHUNK       (3*1024)
    581 #endif
    582 
    583 #else	/* TABLE_BITS */
    584 
    585 static void gcm_gmult_1bit(u64 Xi[2],const u64 H[2])
    586 {
    587 	u128 V,Z = { 0,0 };
    588 	long X;
    589 	int  i,j;
    590 	const long *xi = (const long *)Xi;
    591 	const union { long one; char little; } is_endian = {1};
    592 
    593 	V.hi = H[0];	/* H is in host byte order, no byte swapping */
    594 	V.lo = H[1];
    595 
    596 	for (j=0; j<16/sizeof(long); ++j) {
    597 		if (is_endian.little) {
    598 			if (sizeof(long)==8) {
    599 #ifdef BSWAP8
    600 				X = (long)(BSWAP8(xi[j]));
    601 #else
    602 				const u8 *p = (const u8 *)(xi+j);
    603 				X = (long)((u64)GETU32(p)<<32|GETU32(p+4));
    604 #endif
    605 			}
    606 			else {
    607 				const u8 *p = (const u8 *)(xi+j);
    608 				X = (long)GETU32(p);
    609 			}
    610 		}
    611 		else
    612 			X = xi[j];
    613 
    614 		for (i=0; i<8*sizeof(long); ++i, X<<=1) {
    615 			u64 M = (u64)(X>>(8*sizeof(long)-1));
    616 			Z.hi ^= V.hi&M;
    617 			Z.lo ^= V.lo&M;
    618 
    619 			REDUCE1BIT(V);
    620 		}
    621 	}
    622 
    623 	if (is_endian.little) {
    624 #ifdef BSWAP8
    625 		Xi[0] = BSWAP8(Z.hi);
    626 		Xi[1] = BSWAP8(Z.lo);
    627 #else
    628 		u8 *p = (u8 *)Xi;
    629 		u32 v;
    630 		v = (u32)(Z.hi>>32);	PUTU32(p,v);
    631 		v = (u32)(Z.hi);	PUTU32(p+4,v);
    632 		v = (u32)(Z.lo>>32);	PUTU32(p+8,v);
    633 		v = (u32)(Z.lo);	PUTU32(p+12,v);
    634 #endif
    635 	}
    636 	else {
    637 		Xi[0] = Z.hi;
    638 		Xi[1] = Z.lo;
    639 	}
    640 }
    641 #define GCM_MUL(ctx,Xi)	  gcm_gmult_1bit(ctx->Xi.u,ctx->H.u)
    642 
    643 #endif
    644 
    645 #if	TABLE_BITS==4 && defined(GHASH_ASM)
    646 # if	!defined(I386_ONLY) && \
    647 	(defined(__i386)	|| defined(__i386__)	|| \
    648 	 defined(__x86_64)	|| defined(__x86_64__)	|| \
    649 	 defined(_M_IX86)	|| defined(_M_AMD64)	|| defined(_M_X64))
    650 #  define GHASH_ASM_X86_OR_64
    651 #  define GCM_FUNCREF_4BIT
    652 extern unsigned int OPENSSL_ia32cap_P[2];
    653 
    654 void gcm_init_clmul(u128 Htable[16],const u64 Xi[2]);
    655 void gcm_gmult_clmul(u64 Xi[2],const u128 Htable[16]);
    656 void gcm_ghash_clmul(u64 Xi[2],const u128 Htable[16],const u8 *inp,size_t len);
    657 
    658 #  if	defined(__i386) || defined(__i386__) || defined(_M_IX86)
    659 #   define GHASH_ASM_X86
    660 void gcm_gmult_4bit_mmx(u64 Xi[2],const u128 Htable[16]);
    661 void gcm_ghash_4bit_mmx(u64 Xi[2],const u128 Htable[16],const u8 *inp,size_t len);
    662 
    663 void gcm_gmult_4bit_x86(u64 Xi[2],const u128 Htable[16]);
    664 void gcm_ghash_4bit_x86(u64 Xi[2],const u128 Htable[16],const u8 *inp,size_t len);
    665 #  endif
    666 # elif defined(__arm__) || defined(__arm)
    667 #  include "arm_arch.h"
    668 #  if __ARM_ARCH__>=7
    669 #   define GHASH_ASM_ARM
    670 #   define GCM_FUNCREF_4BIT
    671 void gcm_gmult_neon(u64 Xi[2],const u128 Htable[16]);
    672 void gcm_ghash_neon(u64 Xi[2],const u128 Htable[16],const u8 *inp,size_t len);
    673 #  endif
    674 # endif
    675 #endif
    676 
    677 #ifdef GCM_FUNCREF_4BIT
    678 # undef  GCM_MUL
    679 # define GCM_MUL(ctx,Xi)	(*gcm_gmult_p)(ctx->Xi.u,ctx->Htable)
    680 # ifdef GHASH
    681 #  undef  GHASH
    682 #  define GHASH(ctx,in,len)	(*gcm_ghash_p)(ctx->Xi.u,ctx->Htable,in,len)
    683 # endif
    684 #endif
    685 
    686 void CRYPTO_gcm128_init(GCM128_CONTEXT *ctx,void *key,block128_f block)
    687 {
    688 	const union { long one; char little; } is_endian = {1};
    689 
    690 	memset(ctx,0,sizeof(*ctx));
    691 	ctx->block = block;
    692 	ctx->key   = key;
    693 
    694 	(*block)(ctx->H.c,ctx->H.c,key);
    695 
    696 	if (is_endian.little) {
    697 		/* H is stored in host byte order */
    698 #ifdef BSWAP8
    699 		ctx->H.u[0] = BSWAP8(ctx->H.u[0]);
    700 		ctx->H.u[1] = BSWAP8(ctx->H.u[1]);
    701 #else
    702 		u8 *p = ctx->H.c;
    703 		u64 hi,lo;
    704 		hi = (u64)GETU32(p)  <<32|GETU32(p+4);
    705 		lo = (u64)GETU32(p+8)<<32|GETU32(p+12);
    706 		ctx->H.u[0] = hi;
    707 		ctx->H.u[1] = lo;
    708 #endif
    709 	}
    710 
    711 #if	TABLE_BITS==8
    712 	gcm_init_8bit(ctx->Htable,ctx->H.u);
    713 #elif	TABLE_BITS==4
    714 # if	defined(GHASH_ASM_X86_OR_64)
    715 #  if	!defined(GHASH_ASM_X86) || defined(OPENSSL_IA32_SSE2)
    716 	if (OPENSSL_ia32cap_P[0]&(1<<24) &&	/* check FXSR bit */
    717 	    OPENSSL_ia32cap_P[1]&(1<<1) ) {	/* check PCLMULQDQ bit */
    718 		gcm_init_clmul(ctx->Htable,ctx->H.u);
    719 		ctx->gmult = gcm_gmult_clmul;
    720 		ctx->ghash = gcm_ghash_clmul;
    721 		return;
    722 	}
    723 #  endif
    724 	gcm_init_4bit(ctx->Htable,ctx->H.u);
    725 #  if	defined(GHASH_ASM_X86)			/* x86 only */
    726 #   if	defined(OPENSSL_IA32_SSE2)
    727 	if (OPENSSL_ia32cap_P[0]&(1<<25)) {	/* check SSE bit */
    728 #   else
    729 	if (OPENSSL_ia32cap_P[0]&(1<<23)) {	/* check MMX bit */
    730 #   endif
    731 		ctx->gmult = gcm_gmult_4bit_mmx;
    732 		ctx->ghash = gcm_ghash_4bit_mmx;
    733 	} else {
    734 		ctx->gmult = gcm_gmult_4bit_x86;
    735 		ctx->ghash = gcm_ghash_4bit_x86;
    736 	}
    737 #  else
    738 	ctx->gmult = gcm_gmult_4bit;
    739 	ctx->ghash = gcm_ghash_4bit;
    740 #  endif
    741 # elif	defined(GHASH_ASM_ARM)
    742 	if (OPENSSL_armcap_P & ARMV7_NEON) {
    743 		ctx->gmult = gcm_gmult_neon;
    744 		ctx->ghash = gcm_ghash_neon;
    745 	} else {
    746 		gcm_init_4bit(ctx->Htable,ctx->H.u);
    747 		ctx->gmult = gcm_gmult_4bit;
    748 		ctx->ghash = gcm_ghash_4bit;
    749 	}
    750 # else
    751 	gcm_init_4bit(ctx->Htable,ctx->H.u);
    752 # endif
    753 #endif
    754 }
    755 
    756 void CRYPTO_gcm128_setiv(GCM128_CONTEXT *ctx,const unsigned char *iv,size_t len)
    757 {
    758 	const union { long one; char little; } is_endian = {1};
    759 	unsigned int ctr;
    760 #ifdef GCM_FUNCREF_4BIT
    761 	void (*gcm_gmult_p)(u64 Xi[2],const u128 Htable[16])	= ctx->gmult;
    762 #endif
    763 
    764 	ctx->Yi.u[0]  = 0;
    765 	ctx->Yi.u[1]  = 0;
    766 	ctx->Xi.u[0]  = 0;
    767 	ctx->Xi.u[1]  = 0;
    768 	ctx->len.u[0] = 0;	/* AAD length */
    769 	ctx->len.u[1] = 0;	/* message length */
    770 	ctx->ares = 0;
    771 	ctx->mres = 0;
    772 
    773 	if (len==12) {
    774 		memcpy(ctx->Yi.c,iv,12);
    775 		ctx->Yi.c[15]=1;
    776 		ctr=1;
    777 	}
    778 	else {
    779 		size_t i;
    780 		u64 len0 = len;
    781 
    782 		while (len>=16) {
    783 			for (i=0; i<16; ++i) ctx->Yi.c[i] ^= iv[i];
    784 			GCM_MUL(ctx,Yi);
    785 			iv += 16;
    786 			len -= 16;
    787 		}
    788 		if (len) {
    789 			for (i=0; i<len; ++i) ctx->Yi.c[i] ^= iv[i];
    790 			GCM_MUL(ctx,Yi);
    791 		}
    792 		len0 <<= 3;
    793 		if (is_endian.little) {
    794 #ifdef BSWAP8
    795 			ctx->Yi.u[1]  ^= BSWAP8(len0);
    796 #else
    797 			ctx->Yi.c[8]  ^= (u8)(len0>>56);
    798 			ctx->Yi.c[9]  ^= (u8)(len0>>48);
    799 			ctx->Yi.c[10] ^= (u8)(len0>>40);
    800 			ctx->Yi.c[11] ^= (u8)(len0>>32);
    801 			ctx->Yi.c[12] ^= (u8)(len0>>24);
    802 			ctx->Yi.c[13] ^= (u8)(len0>>16);
    803 			ctx->Yi.c[14] ^= (u8)(len0>>8);
    804 			ctx->Yi.c[15] ^= (u8)(len0);
    805 #endif
    806 		}
    807 		else
    808 			ctx->Yi.u[1]  ^= len0;
    809 
    810 		GCM_MUL(ctx,Yi);
    811 
    812 		if (is_endian.little)
    813 			ctr = GETU32(ctx->Yi.c+12);
    814 		else
    815 			ctr = ctx->Yi.d[3];
    816 	}
    817 
    818 	(*ctx->block)(ctx->Yi.c,ctx->EK0.c,ctx->key);
    819 	++ctr;
    820 	if (is_endian.little)
    821 		PUTU32(ctx->Yi.c+12,ctr);
    822 	else
    823 		ctx->Yi.d[3] = ctr;
    824 }
    825 
    826 int CRYPTO_gcm128_aad(GCM128_CONTEXT *ctx,const unsigned char *aad,size_t len)
    827 {
    828 	size_t i;
    829 	unsigned int n;
    830 	u64 alen = ctx->len.u[0];
    831 #ifdef GCM_FUNCREF_4BIT
    832 	void (*gcm_gmult_p)(u64 Xi[2],const u128 Htable[16])	= ctx->gmult;
    833 # ifdef GHASH
    834 	void (*gcm_ghash_p)(u64 Xi[2],const u128 Htable[16],
    835 				const u8 *inp,size_t len)	= ctx->ghash;
    836 # endif
    837 #endif
    838 
    839 	if (ctx->len.u[1]) return -2;
    840 
    841 	alen += len;
    842 	if (alen>(U64(1)<<61) || (sizeof(len)==8 && alen<len))
    843 		return -1;
    844 	ctx->len.u[0] = alen;
    845 
    846 	n = ctx->ares;
    847 	if (n) {
    848 		while (n && len) {
    849 			ctx->Xi.c[n] ^= *(aad++);
    850 			--len;
    851 			n = (n+1)%16;
    852 		}
    853 		if (n==0) GCM_MUL(ctx,Xi);
    854 		else {
    855 			ctx->ares = n;
    856 			return 0;
    857 		}
    858 	}
    859 
    860 #ifdef GHASH
    861 	if ((i = (len&(size_t)-16))) {
    862 		GHASH(ctx,aad,i);
    863 		aad += i;
    864 		len -= i;
    865 	}
    866 #else
    867 	while (len>=16) {
    868 		for (i=0; i<16; ++i) ctx->Xi.c[i] ^= aad[i];
    869 		GCM_MUL(ctx,Xi);
    870 		aad += 16;
    871 		len -= 16;
    872 	}
    873 #endif
    874 	if (len) {
    875 		n = (unsigned int)len;
    876 		for (i=0; i<len; ++i) ctx->Xi.c[i] ^= aad[i];
    877 	}
    878 
    879 	ctx->ares = n;
    880 	return 0;
    881 }
    882 
    883 int CRYPTO_gcm128_encrypt(GCM128_CONTEXT *ctx,
    884 		const unsigned char *in, unsigned char *out,
    885 		size_t len)
    886 {
    887 	const union { long one; char little; } is_endian = {1};
    888 	unsigned int n, ctr;
    889 	size_t i;
    890 	u64        mlen  = ctx->len.u[1];
    891 	block128_f block = ctx->block;
    892 	void      *key   = ctx->key;
    893 #ifdef GCM_FUNCREF_4BIT
    894 	void (*gcm_gmult_p)(u64 Xi[2],const u128 Htable[16])	= ctx->gmult;
    895 # ifdef GHASH
    896 	void (*gcm_ghash_p)(u64 Xi[2],const u128 Htable[16],
    897 				const u8 *inp,size_t len)	= ctx->ghash;
    898 # endif
    899 #endif
    900 
    901 #if 0
    902 	n = (unsigned int)mlen%16; /* alternative to ctx->mres */
    903 #endif
    904 	mlen += len;
    905 	if (mlen>((U64(1)<<36)-32) || (sizeof(len)==8 && mlen<len))
    906 		return -1;
    907 	ctx->len.u[1] = mlen;
    908 
    909 	if (ctx->ares) {
    910 		/* First call to encrypt finalizes GHASH(AAD) */
    911 		GCM_MUL(ctx,Xi);
    912 		ctx->ares = 0;
    913 	}
    914 
    915 	if (is_endian.little)
    916 		ctr = GETU32(ctx->Yi.c+12);
    917 	else
    918 		ctr = ctx->Yi.d[3];
    919 
    920 	n = ctx->mres;
    921 #if !defined(OPENSSL_SMALL_FOOTPRINT)
    922 	if (16%sizeof(size_t) == 0) do {	/* always true actually */
    923 		if (n) {
    924 			while (n && len) {
    925 				ctx->Xi.c[n] ^= *(out++) = *(in++)^ctx->EKi.c[n];
    926 				--len;
    927 				n = (n+1)%16;
    928 			}
    929 			if (n==0) GCM_MUL(ctx,Xi);
    930 			else {
    931 				ctx->mres = n;
    932 				return 0;
    933 			}
    934 		}
    935 #if defined(STRICT_ALIGNMENT)
    936 		if (((size_t)in|(size_t)out)%sizeof(size_t) != 0)
    937 			break;
    938 #endif
    939 #if defined(GHASH) && defined(GHASH_CHUNK)
    940 		while (len>=GHASH_CHUNK) {
    941 		    size_t j=GHASH_CHUNK;
    942 
    943 		    while (j) {
    944 			(*block)(ctx->Yi.c,ctx->EKi.c,key);
    945 			++ctr;
    946 			if (is_endian.little)
    947 				PUTU32(ctx->Yi.c+12,ctr);
    948 			else
    949 				ctx->Yi.d[3] = ctr;
    950 			for (i=0; i<16; i+=sizeof(size_t))
    951 				*(size_t *)(out+i) =
    952 				*(size_t *)(in+i)^*(size_t *)(ctx->EKi.c+i);
    953 			out += 16;
    954 			in  += 16;
    955 			j   -= 16;
    956 		    }
    957 		    GHASH(ctx,out-GHASH_CHUNK,GHASH_CHUNK);
    958 		    len -= GHASH_CHUNK;
    959 		}
    960 		if ((i = (len&(size_t)-16))) {
    961 		    size_t j=i;
    962 
    963 		    while (len>=16) {
    964 			(*block)(ctx->Yi.c,ctx->EKi.c,key);
    965 			++ctr;
    966 			if (is_endian.little)
    967 				PUTU32(ctx->Yi.c+12,ctr);
    968 			else
    969 				ctx->Yi.d[3] = ctr;
    970 			for (i=0; i<16; i+=sizeof(size_t))
    971 				*(size_t *)(out+i) =
    972 				*(size_t *)(in+i)^*(size_t *)(ctx->EKi.c+i);
    973 			out += 16;
    974 			in  += 16;
    975 			len -= 16;
    976 		    }
    977 		    GHASH(ctx,out-j,j);
    978 		}
    979 #else
    980 		while (len>=16) {
    981 			(*block)(ctx->Yi.c,ctx->EKi.c,key);
    982 			++ctr;
    983 			if (is_endian.little)
    984 				PUTU32(ctx->Yi.c+12,ctr);
    985 			else
    986 				ctx->Yi.d[3] = ctr;
    987 			for (i=0; i<16; i+=sizeof(size_t))
    988 				*(size_t *)(ctx->Xi.c+i) ^=
    989 				*(size_t *)(out+i) =
    990 				*(size_t *)(in+i)^*(size_t *)(ctx->EKi.c+i);
    991 			GCM_MUL(ctx,Xi);
    992 			out += 16;
    993 			in  += 16;
    994 			len -= 16;
    995 		}
    996 #endif
    997 		if (len) {
    998 			(*block)(ctx->Yi.c,ctx->EKi.c,key);
    999 			++ctr;
   1000 			if (is_endian.little)
   1001 				PUTU32(ctx->Yi.c+12,ctr);
   1002 			else
   1003 				ctx->Yi.d[3] = ctr;
   1004 			while (len--) {
   1005 				ctx->Xi.c[n] ^= out[n] = in[n]^ctx->EKi.c[n];
   1006 				++n;
   1007 			}
   1008 		}
   1009 
   1010 		ctx->mres = n;
   1011 		return 0;
   1012 	} while(0);
   1013 #endif
   1014 	for (i=0;i<len;++i) {
   1015 		if (n==0) {
   1016 			(*block)(ctx->Yi.c,ctx->EKi.c,key);
   1017 			++ctr;
   1018 			if (is_endian.little)
   1019 				PUTU32(ctx->Yi.c+12,ctr);
   1020 			else
   1021 				ctx->Yi.d[3] = ctr;
   1022 		}
   1023 		ctx->Xi.c[n] ^= out[i] = in[i]^ctx->EKi.c[n];
   1024 		n = (n+1)%16;
   1025 		if (n==0)
   1026 			GCM_MUL(ctx,Xi);
   1027 	}
   1028 
   1029 	ctx->mres = n;
   1030 	return 0;
   1031 }
   1032 
   1033 int CRYPTO_gcm128_decrypt(GCM128_CONTEXT *ctx,
   1034 		const unsigned char *in, unsigned char *out,
   1035 		size_t len)
   1036 {
   1037 	const union { long one; char little; } is_endian = {1};
   1038 	unsigned int n, ctr;
   1039 	size_t i;
   1040 	u64        mlen  = ctx->len.u[1];
   1041 	block128_f block = ctx->block;
   1042 	void      *key   = ctx->key;
   1043 #ifdef GCM_FUNCREF_4BIT
   1044 	void (*gcm_gmult_p)(u64 Xi[2],const u128 Htable[16])	= ctx->gmult;
   1045 # ifdef GHASH
   1046 	void (*gcm_ghash_p)(u64 Xi[2],const u128 Htable[16],
   1047 				const u8 *inp,size_t len)	= ctx->ghash;
   1048 # endif
   1049 #endif
   1050 
   1051 	mlen += len;
   1052 	if (mlen>((U64(1)<<36)-32) || (sizeof(len)==8 && mlen<len))
   1053 		return -1;
   1054 	ctx->len.u[1] = mlen;
   1055 
   1056 	if (ctx->ares) {
   1057 		/* First call to decrypt finalizes GHASH(AAD) */
   1058 		GCM_MUL(ctx,Xi);
   1059 		ctx->ares = 0;
   1060 	}
   1061 
   1062 	if (is_endian.little)
   1063 		ctr = GETU32(ctx->Yi.c+12);
   1064 	else
   1065 		ctr = ctx->Yi.d[3];
   1066 
   1067 	n = ctx->mres;
   1068 #if !defined(OPENSSL_SMALL_FOOTPRINT)
   1069 	if (16%sizeof(size_t) == 0) do {	/* always true actually */
   1070 		if (n) {
   1071 			while (n && len) {
   1072 				u8 c = *(in++);
   1073 				*(out++) = c^ctx->EKi.c[n];
   1074 				ctx->Xi.c[n] ^= c;
   1075 				--len;
   1076 				n = (n+1)%16;
   1077 			}
   1078 			if (n==0) GCM_MUL (ctx,Xi);
   1079 			else {
   1080 				ctx->mres = n;
   1081 				return 0;
   1082 			}
   1083 		}
   1084 #if defined(STRICT_ALIGNMENT)
   1085 		if (((size_t)in|(size_t)out)%sizeof(size_t) != 0)
   1086 			break;
   1087 #endif
   1088 #if defined(GHASH) && defined(GHASH_CHUNK)
   1089 		while (len>=GHASH_CHUNK) {
   1090 		    size_t j=GHASH_CHUNK;
   1091 
   1092 		    GHASH(ctx,in,GHASH_CHUNK);
   1093 		    while (j) {
   1094 			(*block)(ctx->Yi.c,ctx->EKi.c,key);
   1095 			++ctr;
   1096 			if (is_endian.little)
   1097 				PUTU32(ctx->Yi.c+12,ctr);
   1098 			else
   1099 				ctx->Yi.d[3] = ctr;
   1100 			for (i=0; i<16; i+=sizeof(size_t))
   1101 				*(size_t *)(out+i) =
   1102 				*(size_t *)(in+i)^*(size_t *)(ctx->EKi.c+i);
   1103 			out += 16;
   1104 			in  += 16;
   1105 			j   -= 16;
   1106 		    }
   1107 		    len -= GHASH_CHUNK;
   1108 		}
   1109 		if ((i = (len&(size_t)-16))) {
   1110 		    GHASH(ctx,in,i);
   1111 		    while (len>=16) {
   1112 			(*block)(ctx->Yi.c,ctx->EKi.c,key);
   1113 			++ctr;
   1114 			if (is_endian.little)
   1115 				PUTU32(ctx->Yi.c+12,ctr);
   1116 			else
   1117 				ctx->Yi.d[3] = ctr;
   1118 			for (i=0; i<16; i+=sizeof(size_t))
   1119 				*(size_t *)(out+i) =
   1120 				*(size_t *)(in+i)^*(size_t *)(ctx->EKi.c+i);
   1121 			out += 16;
   1122 			in  += 16;
   1123 			len -= 16;
   1124 		    }
   1125 		}
   1126 #else
   1127 		while (len>=16) {
   1128 			(*block)(ctx->Yi.c,ctx->EKi.c,key);
   1129 			++ctr;
   1130 			if (is_endian.little)
   1131 				PUTU32(ctx->Yi.c+12,ctr);
   1132 			else
   1133 				ctx->Yi.d[3] = ctr;
   1134 			for (i=0; i<16; i+=sizeof(size_t)) {
   1135 				size_t c = *(size_t *)(in+i);
   1136 				*(size_t *)(out+i) = c^*(size_t *)(ctx->EKi.c+i);
   1137 				*(size_t *)(ctx->Xi.c+i) ^= c;
   1138 			}
   1139 			GCM_MUL(ctx,Xi);
   1140 			out += 16;
   1141 			in  += 16;
   1142 			len -= 16;
   1143 		}
   1144 #endif
   1145 		if (len) {
   1146 			(*block)(ctx->Yi.c,ctx->EKi.c,key);
   1147 			++ctr;
   1148 			if (is_endian.little)
   1149 				PUTU32(ctx->Yi.c+12,ctr);
   1150 			else
   1151 				ctx->Yi.d[3] = ctr;
   1152 			while (len--) {
   1153 				u8 c = in[n];
   1154 				ctx->Xi.c[n] ^= c;
   1155 				out[n] = c^ctx->EKi.c[n];
   1156 				++n;
   1157 			}
   1158 		}
   1159 
   1160 		ctx->mres = n;
   1161 		return 0;
   1162 	} while(0);
   1163 #endif
   1164 	for (i=0;i<len;++i) {
   1165 		u8 c;
   1166 		if (n==0) {
   1167 			(*block)(ctx->Yi.c,ctx->EKi.c,key);
   1168 			++ctr;
   1169 			if (is_endian.little)
   1170 				PUTU32(ctx->Yi.c+12,ctr);
   1171 			else
   1172 				ctx->Yi.d[3] = ctr;
   1173 		}
   1174 		c = in[i];
   1175 		out[i] = c^ctx->EKi.c[n];
   1176 		ctx->Xi.c[n] ^= c;
   1177 		n = (n+1)%16;
   1178 		if (n==0)
   1179 			GCM_MUL(ctx,Xi);
   1180 	}
   1181 
   1182 	ctx->mres = n;
   1183 	return 0;
   1184 }
   1185 
   1186 int CRYPTO_gcm128_encrypt_ctr32(GCM128_CONTEXT *ctx,
   1187 		const unsigned char *in, unsigned char *out,
   1188 		size_t len, ctr128_f stream)
   1189 {
   1190 	const union { long one; char little; } is_endian = {1};
   1191 	unsigned int n, ctr;
   1192 	size_t i;
   1193 	u64   mlen = ctx->len.u[1];
   1194 	void *key  = ctx->key;
   1195 #ifdef GCM_FUNCREF_4BIT
   1196 	void (*gcm_gmult_p)(u64 Xi[2],const u128 Htable[16])	= ctx->gmult;
   1197 # ifdef GHASH
   1198 	void (*gcm_ghash_p)(u64 Xi[2],const u128 Htable[16],
   1199 				const u8 *inp,size_t len)	= ctx->ghash;
   1200 # endif
   1201 #endif
   1202 
   1203 	mlen += len;
   1204 	if (mlen>((U64(1)<<36)-32) || (sizeof(len)==8 && mlen<len))
   1205 		return -1;
   1206 	ctx->len.u[1] = mlen;
   1207 
   1208 	if (ctx->ares) {
   1209 		/* First call to encrypt finalizes GHASH(AAD) */
   1210 		GCM_MUL(ctx,Xi);
   1211 		ctx->ares = 0;
   1212 	}
   1213 
   1214 	if (is_endian.little)
   1215 		ctr = GETU32(ctx->Yi.c+12);
   1216 	else
   1217 		ctr = ctx->Yi.d[3];
   1218 
   1219 	n = ctx->mres;
   1220 	if (n) {
   1221 		while (n && len) {
   1222 			ctx->Xi.c[n] ^= *(out++) = *(in++)^ctx->EKi.c[n];
   1223 			--len;
   1224 			n = (n+1)%16;
   1225 		}
   1226 		if (n==0) GCM_MUL(ctx,Xi);
   1227 		else {
   1228 			ctx->mres = n;
   1229 			return 0;
   1230 		}
   1231 	}
   1232 #if defined(GHASH) && !defined(OPENSSL_SMALL_FOOTPRINT)
   1233 	while (len>=GHASH_CHUNK) {
   1234 		(*stream)(in,out,GHASH_CHUNK/16,key,ctx->Yi.c);
   1235 		ctr += GHASH_CHUNK/16;
   1236 		if (is_endian.little)
   1237 			PUTU32(ctx->Yi.c+12,ctr);
   1238 		else
   1239 			ctx->Yi.d[3] = ctr;
   1240 		GHASH(ctx,out,GHASH_CHUNK);
   1241 		out += GHASH_CHUNK;
   1242 		in  += GHASH_CHUNK;
   1243 		len -= GHASH_CHUNK;
   1244 	}
   1245 #endif
   1246 	if ((i = (len&(size_t)-16))) {
   1247 		size_t j=i/16;
   1248 
   1249 		(*stream)(in,out,j,key,ctx->Yi.c);
   1250 		ctr += (unsigned int)j;
   1251 		if (is_endian.little)
   1252 			PUTU32(ctx->Yi.c+12,ctr);
   1253 		else
   1254 			ctx->Yi.d[3] = ctr;
   1255 		in  += i;
   1256 		len -= i;
   1257 #if defined(GHASH)
   1258 		GHASH(ctx,out,i);
   1259 		out += i;
   1260 #else
   1261 		while (j--) {
   1262 			for (i=0;i<16;++i) ctx->Xi.c[i] ^= out[i];
   1263 			GCM_MUL(ctx,Xi);
   1264 			out += 16;
   1265 		}
   1266 #endif
   1267 	}
   1268 	if (len) {
   1269 		(*ctx->block)(ctx->Yi.c,ctx->EKi.c,key);
   1270 		++ctr;
   1271 		if (is_endian.little)
   1272 			PUTU32(ctx->Yi.c+12,ctr);
   1273 		else
   1274 			ctx->Yi.d[3] = ctr;
   1275 		while (len--) {
   1276 			ctx->Xi.c[n] ^= out[n] = in[n]^ctx->EKi.c[n];
   1277 			++n;
   1278 		}
   1279 	}
   1280 
   1281 	ctx->mres = n;
   1282 	return 0;
   1283 }
   1284 
   1285 int CRYPTO_gcm128_decrypt_ctr32(GCM128_CONTEXT *ctx,
   1286 		const unsigned char *in, unsigned char *out,
   1287 		size_t len,ctr128_f stream)
   1288 {
   1289 	const union { long one; char little; } is_endian = {1};
   1290 	unsigned int n, ctr;
   1291 	size_t i;
   1292 	u64   mlen = ctx->len.u[1];
   1293 	void *key  = ctx->key;
   1294 #ifdef GCM_FUNCREF_4BIT
   1295 	void (*gcm_gmult_p)(u64 Xi[2],const u128 Htable[16])	= ctx->gmult;
   1296 # ifdef GHASH
   1297 	void (*gcm_ghash_p)(u64 Xi[2],const u128 Htable[16],
   1298 				const u8 *inp,size_t len)	= ctx->ghash;
   1299 # endif
   1300 #endif
   1301 
   1302 	mlen += len;
   1303 	if (mlen>((U64(1)<<36)-32) || (sizeof(len)==8 && mlen<len))
   1304 		return -1;
   1305 	ctx->len.u[1] = mlen;
   1306 
   1307 	if (ctx->ares) {
   1308 		/* First call to decrypt finalizes GHASH(AAD) */
   1309 		GCM_MUL(ctx,Xi);
   1310 		ctx->ares = 0;
   1311 	}
   1312 
   1313 	if (is_endian.little)
   1314 		ctr = GETU32(ctx->Yi.c+12);
   1315 	else
   1316 		ctr = ctx->Yi.d[3];
   1317 
   1318 	n = ctx->mres;
   1319 	if (n) {
   1320 		while (n && len) {
   1321 			u8 c = *(in++);
   1322 			*(out++) = c^ctx->EKi.c[n];
   1323 			ctx->Xi.c[n] ^= c;
   1324 			--len;
   1325 			n = (n+1)%16;
   1326 		}
   1327 		if (n==0) GCM_MUL (ctx,Xi);
   1328 		else {
   1329 			ctx->mres = n;
   1330 			return 0;
   1331 		}
   1332 	}
   1333 #if defined(GHASH) && !defined(OPENSSL_SMALL_FOOTPRINT)
   1334 	while (len>=GHASH_CHUNK) {
   1335 		GHASH(ctx,in,GHASH_CHUNK);
   1336 		(*stream)(in,out,GHASH_CHUNK/16,key,ctx->Yi.c);
   1337 		ctr += GHASH_CHUNK/16;
   1338 		if (is_endian.little)
   1339 			PUTU32(ctx->Yi.c+12,ctr);
   1340 		else
   1341 			ctx->Yi.d[3] = ctr;
   1342 		out += GHASH_CHUNK;
   1343 		in  += GHASH_CHUNK;
   1344 		len -= GHASH_CHUNK;
   1345 	}
   1346 #endif
   1347 	if ((i = (len&(size_t)-16))) {
   1348 		size_t j=i/16;
   1349 
   1350 #if defined(GHASH)
   1351 		GHASH(ctx,in,i);
   1352 #else
   1353 		while (j--) {
   1354 			size_t k;
   1355 			for (k=0;k<16;++k) ctx->Xi.c[k] ^= in[k];
   1356 			GCM_MUL(ctx,Xi);
   1357 			in += 16;
   1358 		}
   1359 		j   = i/16;
   1360 		in -= i;
   1361 #endif
   1362 		(*stream)(in,out,j,key,ctx->Yi.c);
   1363 		ctr += (unsigned int)j;
   1364 		if (is_endian.little)
   1365 			PUTU32(ctx->Yi.c+12,ctr);
   1366 		else
   1367 			ctx->Yi.d[3] = ctr;
   1368 		out += i;
   1369 		in  += i;
   1370 		len -= i;
   1371 	}
   1372 	if (len) {
   1373 		(*ctx->block)(ctx->Yi.c,ctx->EKi.c,key);
   1374 		++ctr;
   1375 		if (is_endian.little)
   1376 			PUTU32(ctx->Yi.c+12,ctr);
   1377 		else
   1378 			ctx->Yi.d[3] = ctr;
   1379 		while (len--) {
   1380 			u8 c = in[n];
   1381 			ctx->Xi.c[n] ^= c;
   1382 			out[n] = c^ctx->EKi.c[n];
   1383 			++n;
   1384 		}
   1385 	}
   1386 
   1387 	ctx->mres = n;
   1388 	return 0;
   1389 }
   1390 
   1391 int CRYPTO_gcm128_finish(GCM128_CONTEXT *ctx,const unsigned char *tag,
   1392 			size_t len)
   1393 {
   1394 	const union { long one; char little; } is_endian = {1};
   1395 	u64 alen = ctx->len.u[0]<<3;
   1396 	u64 clen = ctx->len.u[1]<<3;
   1397 #ifdef GCM_FUNCREF_4BIT
   1398 	void (*gcm_gmult_p)(u64 Xi[2],const u128 Htable[16])	= ctx->gmult;
   1399 #endif
   1400 
   1401 	if (ctx->mres || ctx->ares)
   1402 		GCM_MUL(ctx,Xi);
   1403 
   1404 	if (is_endian.little) {
   1405 #ifdef BSWAP8
   1406 		alen = BSWAP8(alen);
   1407 		clen = BSWAP8(clen);
   1408 #else
   1409 		u8 *p = ctx->len.c;
   1410 
   1411 		ctx->len.u[0] = alen;
   1412 		ctx->len.u[1] = clen;
   1413 
   1414 		alen = (u64)GETU32(p)  <<32|GETU32(p+4);
   1415 		clen = (u64)GETU32(p+8)<<32|GETU32(p+12);
   1416 #endif
   1417 	}
   1418 
   1419 	ctx->Xi.u[0] ^= alen;
   1420 	ctx->Xi.u[1] ^= clen;
   1421 	GCM_MUL(ctx,Xi);
   1422 
   1423 	ctx->Xi.u[0] ^= ctx->EK0.u[0];
   1424 	ctx->Xi.u[1] ^= ctx->EK0.u[1];
   1425 
   1426 	if (tag && len<=sizeof(ctx->Xi))
   1427 		return memcmp(ctx->Xi.c,tag,len);
   1428 	else
   1429 		return -1;
   1430 }
   1431 
   1432 void CRYPTO_gcm128_tag(GCM128_CONTEXT *ctx, unsigned char *tag, size_t len)
   1433 {
   1434 	CRYPTO_gcm128_finish(ctx, NULL, 0);
   1435 	memcpy(tag, ctx->Xi.c, len<=sizeof(ctx->Xi.c)?len:sizeof(ctx->Xi.c));
   1436 }
   1437 
   1438 GCM128_CONTEXT *CRYPTO_gcm128_new(void *key, block128_f block)
   1439 {
   1440 	GCM128_CONTEXT *ret;
   1441 
   1442 	if ((ret = (GCM128_CONTEXT *)OPENSSL_malloc(sizeof(GCM128_CONTEXT))))
   1443 		CRYPTO_gcm128_init(ret,key,block);
   1444 
   1445 	return ret;
   1446 }
   1447 
   1448 void CRYPTO_gcm128_release(GCM128_CONTEXT *ctx)
   1449 {
   1450 	if (ctx) {
   1451 		OPENSSL_cleanse(ctx,sizeof(*ctx));
   1452 		OPENSSL_free(ctx);
   1453 	}
   1454 }
   1455 
   1456 #if defined(SELFTEST)
   1457 #include <stdio.h>
   1458 #include <openssl/aes.h>
   1459 
   1460 /* Test Case 1 */
   1461 static const u8	K1[16],
   1462 		*P1=NULL,
   1463 		*A1=NULL,
   1464 		IV1[12],
   1465 		*C1=NULL,
   1466 		T1[]=  {0x58,0xe2,0xfc,0xce,0xfa,0x7e,0x30,0x61,0x36,0x7f,0x1d,0x57,0xa4,0xe7,0x45,0x5a};
   1467 
   1468 /* Test Case 2 */
   1469 #define K2 K1
   1470 #define A2 A1
   1471 #define IV2 IV1
   1472 static const u8	P2[16],
   1473 		C2[]=  {0x03,0x88,0xda,0xce,0x60,0xb6,0xa3,0x92,0xf3,0x28,0xc2,0xb9,0x71,0xb2,0xfe,0x78},
   1474 		T2[]=  {0xab,0x6e,0x47,0xd4,0x2c,0xec,0x13,0xbd,0xf5,0x3a,0x67,0xb2,0x12,0x57,0xbd,0xdf};
   1475 
   1476 /* Test Case 3 */
   1477 #define A3 A2
   1478 static const u8	K3[]=  {0xfe,0xff,0xe9,0x92,0x86,0x65,0x73,0x1c,0x6d,0x6a,0x8f,0x94,0x67,0x30,0x83,0x08},
   1479 		P3[]=  {0xd9,0x31,0x32,0x25,0xf8,0x84,0x06,0xe5,0xa5,0x59,0x09,0xc5,0xaf,0xf5,0x26,0x9a,
   1480 			0x86,0xa7,0xa9,0x53,0x15,0x34,0xf7,0xda,0x2e,0x4c,0x30,0x3d,0x8a,0x31,0x8a,0x72,
   1481 			0x1c,0x3c,0x0c,0x95,0x95,0x68,0x09,0x53,0x2f,0xcf,0x0e,0x24,0x49,0xa6,0xb5,0x25,
   1482 			0xb1,0x6a,0xed,0xf5,0xaa,0x0d,0xe6,0x57,0xba,0x63,0x7b,0x39,0x1a,0xaf,0xd2,0x55},
   1483 		IV3[]= {0xca,0xfe,0xba,0xbe,0xfa,0xce,0xdb,0xad,0xde,0xca,0xf8,0x88},
   1484 		C3[]=  {0x42,0x83,0x1e,0xc2,0x21,0x77,0x74,0x24,0x4b,0x72,0x21,0xb7,0x84,0xd0,0xd4,0x9c,
   1485 			0xe3,0xaa,0x21,0x2f,0x2c,0x02,0xa4,0xe0,0x35,0xc1,0x7e,0x23,0x29,0xac,0xa1,0x2e,
   1486 			0x21,0xd5,0x14,0xb2,0x54,0x66,0x93,0x1c,0x7d,0x8f,0x6a,0x5a,0xac,0x84,0xaa,0x05,
   1487 			0x1b,0xa3,0x0b,0x39,0x6a,0x0a,0xac,0x97,0x3d,0x58,0xe0,0x91,0x47,0x3f,0x59,0x85},
   1488 		T3[]=  {0x4d,0x5c,0x2a,0xf3,0x27,0xcd,0x64,0xa6,0x2c,0xf3,0x5a,0xbd,0x2b,0xa6,0xfa,0xb4};
   1489 
   1490 /* Test Case 4 */
   1491 #define K4 K3
   1492 #define IV4 IV3
   1493 static const u8	P4[]=  {0xd9,0x31,0x32,0x25,0xf8,0x84,0x06,0xe5,0xa5,0x59,0x09,0xc5,0xaf,0xf5,0x26,0x9a,
   1494 			0x86,0xa7,0xa9,0x53,0x15,0x34,0xf7,0xda,0x2e,0x4c,0x30,0x3d,0x8a,0x31,0x8a,0x72,
   1495 			0x1c,0x3c,0x0c,0x95,0x95,0x68,0x09,0x53,0x2f,0xcf,0x0e,0x24,0x49,0xa6,0xb5,0x25,
   1496 			0xb1,0x6a,0xed,0xf5,0xaa,0x0d,0xe6,0x57,0xba,0x63,0x7b,0x39},
   1497 		A4[]=  {0xfe,0xed,0xfa,0xce,0xde,0xad,0xbe,0xef,0xfe,0xed,0xfa,0xce,0xde,0xad,0xbe,0xef,
   1498 			0xab,0xad,0xda,0xd2},
   1499 		C4[]=  {0x42,0x83,0x1e,0xc2,0x21,0x77,0x74,0x24,0x4b,0x72,0x21,0xb7,0x84,0xd0,0xd4,0x9c,
   1500 			0xe3,0xaa,0x21,0x2f,0x2c,0x02,0xa4,0xe0,0x35,0xc1,0x7e,0x23,0x29,0xac,0xa1,0x2e,
   1501 			0x21,0xd5,0x14,0xb2,0x54,0x66,0x93,0x1c,0x7d,0x8f,0x6a,0x5a,0xac,0x84,0xaa,0x05,
   1502 			0x1b,0xa3,0x0b,0x39,0x6a,0x0a,0xac,0x97,0x3d,0x58,0xe0,0x91},
   1503 		T4[]=  {0x5b,0xc9,0x4f,0xbc,0x32,0x21,0xa5,0xdb,0x94,0xfa,0xe9,0x5a,0xe7,0x12,0x1a,0x47};
   1504 
   1505 /* Test Case 5 */
   1506 #define K5 K4
   1507 #define P5 P4
   1508 #define A5 A4
   1509 static const u8	IV5[]= {0xca,0xfe,0xba,0xbe,0xfa,0xce,0xdb,0xad},
   1510 		C5[]=  {0x61,0x35,0x3b,0x4c,0x28,0x06,0x93,0x4a,0x77,0x7f,0xf5,0x1f,0xa2,0x2a,0x47,0x55,
   1511 			0x69,0x9b,0x2a,0x71,0x4f,0xcd,0xc6,0xf8,0x37,0x66,0xe5,0xf9,0x7b,0x6c,0x74,0x23,
   1512 			0x73,0x80,0x69,0x00,0xe4,0x9f,0x24,0xb2,0x2b,0x09,0x75,0x44,0xd4,0x89,0x6b,0x42,
   1513 			0x49,0x89,0xb5,0xe1,0xeb,0xac,0x0f,0x07,0xc2,0x3f,0x45,0x98},
   1514 		T5[]=  {0x36,0x12,0xd2,0xe7,0x9e,0x3b,0x07,0x85,0x56,0x1b,0xe1,0x4a,0xac,0xa2,0xfc,0xcb};
   1515 
   1516 /* Test Case 6 */
   1517 #define K6 K5
   1518 #define P6 P5
   1519 #define A6 A5
   1520 static const u8	IV6[]= {0x93,0x13,0x22,0x5d,0xf8,0x84,0x06,0xe5,0x55,0x90,0x9c,0x5a,0xff,0x52,0x69,0xaa,
   1521 			0x6a,0x7a,0x95,0x38,0x53,0x4f,0x7d,0xa1,0xe4,0xc3,0x03,0xd2,0xa3,0x18,0xa7,0x28,
   1522 			0xc3,0xc0,0xc9,0x51,0x56,0x80,0x95,0x39,0xfc,0xf0,0xe2,0x42,0x9a,0x6b,0x52,0x54,
   1523 			0x16,0xae,0xdb,0xf5,0xa0,0xde,0x6a,0x57,0xa6,0x37,0xb3,0x9b},
   1524 		C6[]=  {0x8c,0xe2,0x49,0x98,0x62,0x56,0x15,0xb6,0x03,0xa0,0x33,0xac,0xa1,0x3f,0xb8,0x94,
   1525 			0xbe,0x91,0x12,0xa5,0xc3,0xa2,0x11,0xa8,0xba,0x26,0x2a,0x3c,0xca,0x7e,0x2c,0xa7,
   1526 			0x01,0xe4,0xa9,0xa4,0xfb,0xa4,0x3c,0x90,0xcc,0xdc,0xb2,0x81,0xd4,0x8c,0x7c,0x6f,
   1527 			0xd6,0x28,0x75,0xd2,0xac,0xa4,0x17,0x03,0x4c,0x34,0xae,0xe5},
   1528 		T6[]=  {0x61,0x9c,0xc5,0xae,0xff,0xfe,0x0b,0xfa,0x46,0x2a,0xf4,0x3c,0x16,0x99,0xd0,0x50};
   1529 
   1530 /* Test Case 7 */
   1531 static const u8 K7[24],
   1532 		*P7=NULL,
   1533 		*A7=NULL,
   1534 		IV7[12],
   1535 		*C7=NULL,
   1536 		T7[]=  {0xcd,0x33,0xb2,0x8a,0xc7,0x73,0xf7,0x4b,0xa0,0x0e,0xd1,0xf3,0x12,0x57,0x24,0x35};
   1537 
   1538 /* Test Case 8 */
   1539 #define K8 K7
   1540 #define IV8 IV7
   1541 #define A8 A7
   1542 static const u8	P8[16],
   1543 		C8[]=  {0x98,0xe7,0x24,0x7c,0x07,0xf0,0xfe,0x41,0x1c,0x26,0x7e,0x43,0x84,0xb0,0xf6,0x00},
   1544 		T8[]=  {0x2f,0xf5,0x8d,0x80,0x03,0x39,0x27,0xab,0x8e,0xf4,0xd4,0x58,0x75,0x14,0xf0,0xfb};
   1545 
   1546 /* Test Case 9 */
   1547 #define A9 A8
   1548 static const u8	K9[]=  {0xfe,0xff,0xe9,0x92,0x86,0x65,0x73,0x1c,0x6d,0x6a,0x8f,0x94,0x67,0x30,0x83,0x08,
   1549 			0xfe,0xff,0xe9,0x92,0x86,0x65,0x73,0x1c},
   1550 		P9[]=  {0xd9,0x31,0x32,0x25,0xf8,0x84,0x06,0xe5,0xa5,0x59,0x09,0xc5,0xaf,0xf5,0x26,0x9a,
   1551 			0x86,0xa7,0xa9,0x53,0x15,0x34,0xf7,0xda,0x2e,0x4c,0x30,0x3d,0x8a,0x31,0x8a,0x72,
   1552 			0x1c,0x3c,0x0c,0x95,0x95,0x68,0x09,0x53,0x2f,0xcf,0x0e,0x24,0x49,0xa6,0xb5,0x25,
   1553 			0xb1,0x6a,0xed,0xf5,0xaa,0x0d,0xe6,0x57,0xba,0x63,0x7b,0x39,0x1a,0xaf,0xd2,0x55},
   1554 		IV9[]= {0xca,0xfe,0xba,0xbe,0xfa,0xce,0xdb,0xad,0xde,0xca,0xf8,0x88},
   1555 		C9[]=  {0x39,0x80,0xca,0x0b,0x3c,0x00,0xe8,0x41,0xeb,0x06,0xfa,0xc4,0x87,0x2a,0x27,0x57,
   1556 			0x85,0x9e,0x1c,0xea,0xa6,0xef,0xd9,0x84,0x62,0x85,0x93,0xb4,0x0c,0xa1,0xe1,0x9c,
   1557 			0x7d,0x77,0x3d,0x00,0xc1,0x44,0xc5,0x25,0xac,0x61,0x9d,0x18,0xc8,0x4a,0x3f,0x47,
   1558 			0x18,0xe2,0x44,0x8b,0x2f,0xe3,0x24,0xd9,0xcc,0xda,0x27,0x10,0xac,0xad,0xe2,0x56},
   1559 		T9[]=  {0x99,0x24,0xa7,0xc8,0x58,0x73,0x36,0xbf,0xb1,0x18,0x02,0x4d,0xb8,0x67,0x4a,0x14};
   1560 
   1561 /* Test Case 10 */
   1562 #define K10 K9
   1563 #define IV10 IV9
   1564 static const u8	P10[]= {0xd9,0x31,0x32,0x25,0xf8,0x84,0x06,0xe5,0xa5,0x59,0x09,0xc5,0xaf,0xf5,0x26,0x9a,
   1565 			0x86,0xa7,0xa9,0x53,0x15,0x34,0xf7,0xda,0x2e,0x4c,0x30,0x3d,0x8a,0x31,0x8a,0x72,
   1566 			0x1c,0x3c,0x0c,0x95,0x95,0x68,0x09,0x53,0x2f,0xcf,0x0e,0x24,0x49,0xa6,0xb5,0x25,
   1567 			0xb1,0x6a,0xed,0xf5,0xaa,0x0d,0xe6,0x57,0xba,0x63,0x7b,0x39},
   1568 		A10[]= {0xfe,0xed,0xfa,0xce,0xde,0xad,0xbe,0xef,0xfe,0xed,0xfa,0xce,0xde,0xad,0xbe,0xef,
   1569 			0xab,0xad,0xda,0xd2},
   1570 		C10[]= {0x39,0x80,0xca,0x0b,0x3c,0x00,0xe8,0x41,0xeb,0x06,0xfa,0xc4,0x87,0x2a,0x27,0x57,
   1571 			0x85,0x9e,0x1c,0xea,0xa6,0xef,0xd9,0x84,0x62,0x85,0x93,0xb4,0x0c,0xa1,0xe1,0x9c,
   1572 			0x7d,0x77,0x3d,0x00,0xc1,0x44,0xc5,0x25,0xac,0x61,0x9d,0x18,0xc8,0x4a,0x3f,0x47,
   1573 			0x18,0xe2,0x44,0x8b,0x2f,0xe3,0x24,0xd9,0xcc,0xda,0x27,0x10},
   1574 		T10[]= {0x25,0x19,0x49,0x8e,0x80,0xf1,0x47,0x8f,0x37,0xba,0x55,0xbd,0x6d,0x27,0x61,0x8c};
   1575 
   1576 /* Test Case 11 */
   1577 #define K11 K10
   1578 #define P11 P10
   1579 #define A11 A10
   1580 static const u8	IV11[]={0xca,0xfe,0xba,0xbe,0xfa,0xce,0xdb,0xad},
   1581 		C11[]= {0x0f,0x10,0xf5,0x99,0xae,0x14,0xa1,0x54,0xed,0x24,0xb3,0x6e,0x25,0x32,0x4d,0xb8,
   1582 			0xc5,0x66,0x63,0x2e,0xf2,0xbb,0xb3,0x4f,0x83,0x47,0x28,0x0f,0xc4,0x50,0x70,0x57,
   1583 			0xfd,0xdc,0x29,0xdf,0x9a,0x47,0x1f,0x75,0xc6,0x65,0x41,0xd4,0xd4,0xda,0xd1,0xc9,
   1584 			0xe9,0x3a,0x19,0xa5,0x8e,0x8b,0x47,0x3f,0xa0,0xf0,0x62,0xf7},
   1585 		T11[]= {0x65,0xdc,0xc5,0x7f,0xcf,0x62,0x3a,0x24,0x09,0x4f,0xcc,0xa4,0x0d,0x35,0x33,0xf8};
   1586 
   1587 /* Test Case 12 */
   1588 #define K12 K11
   1589 #define P12 P11
   1590 #define A12 A11
   1591 static const u8	IV12[]={0x93,0x13,0x22,0x5d,0xf8,0x84,0x06,0xe5,0x55,0x90,0x9c,0x5a,0xff,0x52,0x69,0xaa,
   1592 			0x6a,0x7a,0x95,0x38,0x53,0x4f,0x7d,0xa1,0xe4,0xc3,0x03,0xd2,0xa3,0x18,0xa7,0x28,
   1593 			0xc3,0xc0,0xc9,0x51,0x56,0x80,0x95,0x39,0xfc,0xf0,0xe2,0x42,0x9a,0x6b,0x52,0x54,
   1594 			0x16,0xae,0xdb,0xf5,0xa0,0xde,0x6a,0x57,0xa6,0x37,0xb3,0x9b},
   1595 		C12[]= {0xd2,0x7e,0x88,0x68,0x1c,0xe3,0x24,0x3c,0x48,0x30,0x16,0x5a,0x8f,0xdc,0xf9,0xff,
   1596 			0x1d,0xe9,0xa1,0xd8,0xe6,0xb4,0x47,0xef,0x6e,0xf7,0xb7,0x98,0x28,0x66,0x6e,0x45,
   1597 			0x81,0xe7,0x90,0x12,0xaf,0x34,0xdd,0xd9,0xe2,0xf0,0x37,0x58,0x9b,0x29,0x2d,0xb3,
   1598 			0xe6,0x7c,0x03,0x67,0x45,0xfa,0x22,0xe7,0xe9,0xb7,0x37,0x3b},
   1599 		T12[]= {0xdc,0xf5,0x66,0xff,0x29,0x1c,0x25,0xbb,0xb8,0x56,0x8f,0xc3,0xd3,0x76,0xa6,0xd9};
   1600 
   1601 /* Test Case 13 */
   1602 static const u8	K13[32],
   1603 		*P13=NULL,
   1604 		*A13=NULL,
   1605 		IV13[12],
   1606 		*C13=NULL,
   1607 		T13[]={0x53,0x0f,0x8a,0xfb,0xc7,0x45,0x36,0xb9,0xa9,0x63,0xb4,0xf1,0xc4,0xcb,0x73,0x8b};
   1608 
   1609 /* Test Case 14 */
   1610 #define K14 K13
   1611 #define A14 A13
   1612 static const u8	P14[16],
   1613 		IV14[12],
   1614 		C14[]= {0xce,0xa7,0x40,0x3d,0x4d,0x60,0x6b,0x6e,0x07,0x4e,0xc5,0xd3,0xba,0xf3,0x9d,0x18},
   1615 		T14[]= {0xd0,0xd1,0xc8,0xa7,0x99,0x99,0x6b,0xf0,0x26,0x5b,0x98,0xb5,0xd4,0x8a,0xb9,0x19};
   1616 
   1617 /* Test Case 15 */
   1618 #define A15 A14
   1619 static const u8	K15[]= {0xfe,0xff,0xe9,0x92,0x86,0x65,0x73,0x1c,0x6d,0x6a,0x8f,0x94,0x67,0x30,0x83,0x08,
   1620 			0xfe,0xff,0xe9,0x92,0x86,0x65,0x73,0x1c,0x6d,0x6a,0x8f,0x94,0x67,0x30,0x83,0x08},
   1621 		P15[]= {0xd9,0x31,0x32,0x25,0xf8,0x84,0x06,0xe5,0xa5,0x59,0x09,0xc5,0xaf,0xf5,0x26,0x9a,
   1622 			0x86,0xa7,0xa9,0x53,0x15,0x34,0xf7,0xda,0x2e,0x4c,0x30,0x3d,0x8a,0x31,0x8a,0x72,
   1623 			0x1c,0x3c,0x0c,0x95,0x95,0x68,0x09,0x53,0x2f,0xcf,0x0e,0x24,0x49,0xa6,0xb5,0x25,
   1624 			0xb1,0x6a,0xed,0xf5,0xaa,0x0d,0xe6,0x57,0xba,0x63,0x7b,0x39,0x1a,0xaf,0xd2,0x55},
   1625 		IV15[]={0xca,0xfe,0xba,0xbe,0xfa,0xce,0xdb,0xad,0xde,0xca,0xf8,0x88},
   1626 		C15[]= {0x52,0x2d,0xc1,0xf0,0x99,0x56,0x7d,0x07,0xf4,0x7f,0x37,0xa3,0x2a,0x84,0x42,0x7d,
   1627 			0x64,0x3a,0x8c,0xdc,0xbf,0xe5,0xc0,0xc9,0x75,0x98,0xa2,0xbd,0x25,0x55,0xd1,0xaa,
   1628 			0x8c,0xb0,0x8e,0x48,0x59,0x0d,0xbb,0x3d,0xa7,0xb0,0x8b,0x10,0x56,0x82,0x88,0x38,
   1629 			0xc5,0xf6,0x1e,0x63,0x93,0xba,0x7a,0x0a,0xbc,0xc9,0xf6,0x62,0x89,0x80,0x15,0xad},
   1630 		T15[]= {0xb0,0x94,0xda,0xc5,0xd9,0x34,0x71,0xbd,0xec,0x1a,0x50,0x22,0x70,0xe3,0xcc,0x6c};
   1631 
   1632 /* Test Case 16 */
   1633 #define K16 K15
   1634 #define IV16 IV15
   1635 static const u8	P16[]= {0xd9,0x31,0x32,0x25,0xf8,0x84,0x06,0xe5,0xa5,0x59,0x09,0xc5,0xaf,0xf5,0x26,0x9a,
   1636 			0x86,0xa7,0xa9,0x53,0x15,0x34,0xf7,0xda,0x2e,0x4c,0x30,0x3d,0x8a,0x31,0x8a,0x72,
   1637 			0x1c,0x3c,0x0c,0x95,0x95,0x68,0x09,0x53,0x2f,0xcf,0x0e,0x24,0x49,0xa6,0xb5,0x25,
   1638 			0xb1,0x6a,0xed,0xf5,0xaa,0x0d,0xe6,0x57,0xba,0x63,0x7b,0x39},
   1639 		A16[]= {0xfe,0xed,0xfa,0xce,0xde,0xad,0xbe,0xef,0xfe,0xed,0xfa,0xce,0xde,0xad,0xbe,0xef,
   1640 			0xab,0xad,0xda,0xd2},
   1641 		C16[]= {0x52,0x2d,0xc1,0xf0,0x99,0x56,0x7d,0x07,0xf4,0x7f,0x37,0xa3,0x2a,0x84,0x42,0x7d,
   1642 			0x64,0x3a,0x8c,0xdc,0xbf,0xe5,0xc0,0xc9,0x75,0x98,0xa2,0xbd,0x25,0x55,0xd1,0xaa,
   1643 			0x8c,0xb0,0x8e,0x48,0x59,0x0d,0xbb,0x3d,0xa7,0xb0,0x8b,0x10,0x56,0x82,0x88,0x38,
   1644 			0xc5,0xf6,0x1e,0x63,0x93,0xba,0x7a,0x0a,0xbc,0xc9,0xf6,0x62},
   1645 		T16[]= {0x76,0xfc,0x6e,0xce,0x0f,0x4e,0x17,0x68,0xcd,0xdf,0x88,0x53,0xbb,0x2d,0x55,0x1b};
   1646 
   1647 /* Test Case 17 */
   1648 #define K17 K16
   1649 #define P17 P16
   1650 #define A17 A16
   1651 static const u8	IV17[]={0xca,0xfe,0xba,0xbe,0xfa,0xce,0xdb,0xad},
   1652 		C17[]= {0xc3,0x76,0x2d,0xf1,0xca,0x78,0x7d,0x32,0xae,0x47,0xc1,0x3b,0xf1,0x98,0x44,0xcb,
   1653 			0xaf,0x1a,0xe1,0x4d,0x0b,0x97,0x6a,0xfa,0xc5,0x2f,0xf7,0xd7,0x9b,0xba,0x9d,0xe0,
   1654 			0xfe,0xb5,0x82,0xd3,0x39,0x34,0xa4,0xf0,0x95,0x4c,0xc2,0x36,0x3b,0xc7,0x3f,0x78,
   1655 			0x62,0xac,0x43,0x0e,0x64,0xab,0xe4,0x99,0xf4,0x7c,0x9b,0x1f},
   1656 		T17[]= {0x3a,0x33,0x7d,0xbf,0x46,0xa7,0x92,0xc4,0x5e,0x45,0x49,0x13,0xfe,0x2e,0xa8,0xf2};
   1657 
   1658 /* Test Case 18 */
   1659 #define K18 K17
   1660 #define P18 P17
   1661 #define A18 A17
   1662 static const u8	IV18[]={0x93,0x13,0x22,0x5d,0xf8,0x84,0x06,0xe5,0x55,0x90,0x9c,0x5a,0xff,0x52,0x69,0xaa,
   1663 			0x6a,0x7a,0x95,0x38,0x53,0x4f,0x7d,0xa1,0xe4,0xc3,0x03,0xd2,0xa3,0x18,0xa7,0x28,
   1664 			0xc3,0xc0,0xc9,0x51,0x56,0x80,0x95,0x39,0xfc,0xf0,0xe2,0x42,0x9a,0x6b,0x52,0x54,
   1665 			0x16,0xae,0xdb,0xf5,0xa0,0xde,0x6a,0x57,0xa6,0x37,0xb3,0x9b},
   1666 		C18[]= {0x5a,0x8d,0xef,0x2f,0x0c,0x9e,0x53,0xf1,0xf7,0x5d,0x78,0x53,0x65,0x9e,0x2a,0x20,
   1667 			0xee,0xb2,0xb2,0x2a,0xaf,0xde,0x64,0x19,0xa0,0x58,0xab,0x4f,0x6f,0x74,0x6b,0xf4,
   1668 			0x0f,0xc0,0xc3,0xb7,0x80,0xf2,0x44,0x45,0x2d,0xa3,0xeb,0xf1,0xc5,0xd8,0x2c,0xde,
   1669 			0xa2,0x41,0x89,0x97,0x20,0x0e,0xf8,0x2e,0x44,0xae,0x7e,0x3f},
   1670 		T18[]= {0xa4,0x4a,0x82,0x66,0xee,0x1c,0x8e,0xb0,0xc8,0xb5,0xd4,0xcf,0x5a,0xe9,0xf1,0x9a};
   1671 
   1672 #define TEST_CASE(n)	do {					\
   1673 	u8 out[sizeof(P##n)];					\
   1674 	AES_set_encrypt_key(K##n,sizeof(K##n)*8,&key);		\
   1675 	CRYPTO_gcm128_init(&ctx,&key,(block128_f)AES_encrypt);	\
   1676 	CRYPTO_gcm128_setiv(&ctx,IV##n,sizeof(IV##n));		\
   1677 	memset(out,0,sizeof(out));				\
   1678 	if (A##n) CRYPTO_gcm128_aad(&ctx,A##n,sizeof(A##n));	\
   1679 	if (P##n) CRYPTO_gcm128_encrypt(&ctx,P##n,out,sizeof(out));	\
   1680 	if (CRYPTO_gcm128_finish(&ctx,T##n,16) ||		\
   1681 	    (C##n && memcmp(out,C##n,sizeof(out))))		\
   1682 		ret++, printf ("encrypt test#%d failed.\n",n);	\
   1683 	CRYPTO_gcm128_setiv(&ctx,IV##n,sizeof(IV##n));		\
   1684 	memset(out,0,sizeof(out));				\
   1685 	if (A##n) CRYPTO_gcm128_aad(&ctx,A##n,sizeof(A##n));	\
   1686 	if (C##n) CRYPTO_gcm128_decrypt(&ctx,C##n,out,sizeof(out));	\
   1687 	if (CRYPTO_gcm128_finish(&ctx,T##n,16) ||		\
   1688 	    (P##n && memcmp(out,P##n,sizeof(out))))		\
   1689 		ret++, printf ("decrypt test#%d failed.\n",n);	\
   1690 	} while(0)
   1691 
   1692 int main()
   1693 {
   1694 	GCM128_CONTEXT ctx;
   1695 	AES_KEY key;
   1696 	int ret=0;
   1697 
   1698 	TEST_CASE(1);
   1699 	TEST_CASE(2);
   1700 	TEST_CASE(3);
   1701 	TEST_CASE(4);
   1702 	TEST_CASE(5);
   1703 	TEST_CASE(6);
   1704 	TEST_CASE(7);
   1705 	TEST_CASE(8);
   1706 	TEST_CASE(9);
   1707 	TEST_CASE(10);
   1708 	TEST_CASE(11);
   1709 	TEST_CASE(12);
   1710 	TEST_CASE(13);
   1711 	TEST_CASE(14);
   1712 	TEST_CASE(15);
   1713 	TEST_CASE(16);
   1714 	TEST_CASE(17);
   1715 	TEST_CASE(18);
   1716 
   1717 #ifdef OPENSSL_CPUID_OBJ
   1718 	{
   1719 	size_t start,stop,gcm_t,ctr_t,OPENSSL_rdtsc();
   1720 	union { u64 u; u8 c[1024]; } buf;
   1721 	int i;
   1722 
   1723 	AES_set_encrypt_key(K1,sizeof(K1)*8,&key);
   1724 	CRYPTO_gcm128_init(&ctx,&key,(block128_f)AES_encrypt);
   1725 	CRYPTO_gcm128_setiv(&ctx,IV1,sizeof(IV1));
   1726 
   1727 	CRYPTO_gcm128_encrypt(&ctx,buf.c,buf.c,sizeof(buf));
   1728 	start = OPENSSL_rdtsc();
   1729 	CRYPTO_gcm128_encrypt(&ctx,buf.c,buf.c,sizeof(buf));
   1730 	gcm_t = OPENSSL_rdtsc() - start;
   1731 
   1732 	CRYPTO_ctr128_encrypt(buf.c,buf.c,sizeof(buf),
   1733 			&key,ctx.Yi.c,ctx.EKi.c,&ctx.mres,
   1734 			(block128_f)AES_encrypt);
   1735 	start = OPENSSL_rdtsc();
   1736 	CRYPTO_ctr128_encrypt(buf.c,buf.c,sizeof(buf),
   1737 			&key,ctx.Yi.c,ctx.EKi.c,&ctx.mres,
   1738 			(block128_f)AES_encrypt);
   1739 	ctr_t = OPENSSL_rdtsc() - start;
   1740 
   1741 	printf("%.2f-%.2f=%.2f\n",
   1742 			gcm_t/(double)sizeof(buf),
   1743 			ctr_t/(double)sizeof(buf),
   1744 			(gcm_t-ctr_t)/(double)sizeof(buf));
   1745 #ifdef GHASH
   1746 	GHASH(&ctx,buf.c,sizeof(buf));
   1747 	start = OPENSSL_rdtsc();
   1748 	for (i=0;i<100;++i) GHASH(&ctx,buf.c,sizeof(buf));
   1749 	gcm_t = OPENSSL_rdtsc() - start;
   1750 	printf("%.2f\n",gcm_t/(double)sizeof(buf)/(double)i);
   1751 #endif
   1752 	}
   1753 #endif
   1754 
   1755 	return ret;
   1756 }
   1757 #endif
   1758