50 #define OPENSSL_FIPSAPI
63 #if defined(BSWAP4) && defined(STRICT_ALIGNMENT)
66 #define GETU32(p) BSWAP4(*(const u32 *)(p))
68 #define PUTU32(p,v) *(u32 *)(p) = BSWAP4(v)
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; \
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); \
121 static void gcm_init_8bit(
u128 Htable[256],
u64 H[2])
131 for (Htable[128]=V, i=64; i>0; i>>=1) {
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;
145 static void gcm_gmult_8bit(
u64 Xi[2],
const u128 Htable[256])
148 const u8 *xi = (
const u8 *)Xi+15;
150 const union {
long one;
char little; } is_endian = {1};
151 static const size_t rem_8bit[256] = {
218 Z.
hi ^= Htable[n].
hi;
219 Z.
lo ^= Htable[n].
lo;
221 if ((
u8 *)Xi==xi)
break;
225 rem = (size_t)Z.
lo&0xff;
226 Z.
lo = (Z.
hi<<56)|(Z.
lo>>8);
228 if (
sizeof(
size_t)==8)
229 Z.
hi ^= rem_8bit[rem];
231 Z.
hi ^= (
u64)rem_8bit[rem]<<32;
234 if (is_endian.little) {
236 Xi[0] = BSWAP8(Z.
hi);
237 Xi[1] = BSWAP8(Z.
lo);
252 #define GCM_MUL(ctx,Xi) gcm_gmult_8bit(ctx->Xi.u,ctx->Htable)
256 static void gcm_init_4bit(
u128 Htable[16],
u64 H[2])
259 #if defined(OPENSSL_SMALL_FOOTPRINT)
268 #if defined(OPENSSL_SMALL_FOOTPRINT)
269 for (Htable[8]=V, i=4; i>0; i>>=1) {
274 for (i=2; i<16; i<<=1) {
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;
290 Htable[3].
hi = V.
hi^Htable[2].
hi, Htable[3].
lo = V.
lo^Htable[2].
lo;
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;
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;
304 #if defined(GHASH_ASM) && (defined(__arm__) || defined(__arm))
310 const union {
long one;
char little; } is_endian = {1};
312 if (is_endian.little)
321 Htable[j].
hi = V.
lo<<32|V.
lo>>32;
322 Htable[j].
lo = V.
hi<<32|V.
hi>>32;
329 static const size_t rem_4bit[16] = {
335 static void gcm_gmult_4bit(
u64 Xi[2],
const u128 Htable[16])
339 size_t rem, nlo, nhi;
340 const union {
long one;
char little; } is_endian = {1};
342 nlo = ((
const u8 *)Xi)[15];
346 Z.
hi = Htable[nlo].
hi;
347 Z.
lo = Htable[nlo].
lo;
350 rem = (size_t)Z.
lo&0xf;
351 Z.
lo = (Z.
hi<<60)|(Z.
lo>>4);
353 if (
sizeof(
size_t)==8)
354 Z.
hi ^= rem_4bit[rem];
356 Z.
hi ^= (
u64)rem_4bit[rem]<<32;
358 Z.
hi ^= Htable[nhi].
hi;
359 Z.
lo ^= Htable[nhi].
lo;
363 nlo = ((
const u8 *)Xi)[cnt];
367 rem = (size_t)Z.
lo&0xf;
368 Z.
lo = (Z.
hi<<60)|(Z.
lo>>4);
370 if (
sizeof(
size_t)==8)
371 Z.
hi ^= rem_4bit[rem];
373 Z.
hi ^= (
u64)rem_4bit[rem]<<32;
375 Z.
hi ^= Htable[nlo].
hi;
376 Z.
lo ^= Htable[nlo].
lo;
379 if (is_endian.little) {
381 Xi[0] = BSWAP8(Z.
hi);
382 Xi[1] = BSWAP8(Z.
lo);
398 #if !defined(OPENSSL_SMALL_FOOTPRINT)
406 static void gcm_ghash_4bit(
u64 Xi[2],
const u128 Htable[16],
407 const u8 *inp,
size_t len)
411 size_t rem, nlo, nhi;
412 const union {
long one;
char little; } is_endian = {1};
417 nlo = ((
const u8 *)Xi)[15];
422 Z.
hi = Htable[nlo].
hi;
423 Z.
lo = Htable[nlo].
lo;
426 rem = (size_t)Z.
lo&0xf;
427 Z.
lo = (Z.
hi<<60)|(Z.
lo>>4);
429 if (
sizeof(
size_t)==8)
430 Z.
hi ^= rem_4bit[rem];
432 Z.
hi ^= (
u64)rem_4bit[rem]<<32;
434 Z.
hi ^= Htable[nhi].
hi;
435 Z.
lo ^= Htable[nhi].
lo;
439 nlo = ((
const u8 *)Xi)[cnt];
444 rem = (size_t)Z.
lo&0xf;
445 Z.
lo = (Z.
hi<<60)|(Z.
lo>>4);
447 if (
sizeof(
size_t)==8)
448 Z.
hi ^= rem_4bit[rem];
450 Z.
hi ^= (
u64)rem_4bit[rem]<<32;
452 Z.
hi ^= Htable[nlo].
hi;
453 Z.
lo ^= Htable[nlo].
lo;
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 };
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);
512 for (Z.
lo=0, Z.
hi=0, cnt=15; cnt; --cnt) {
513 nlo = ((
const u8 *)Xi)[cnt];
518 Z.
hi ^= Htable[nlo].
hi;
519 Z.
lo ^= Htable[nlo].
lo;
521 rem = (size_t)Z.
lo&0xff;
523 Z.
lo = (Z.
hi<<56)|(Z.
lo>>8);
526 Z.
hi ^= Hshr4[nhi].
hi;
527 Z.
lo ^= Hshr4[nhi].
lo;
528 Z.
hi ^= (
u64)rem_8bit[rem^Hshl4[nhi]]<<48;
531 nlo = ((
const u8 *)Xi)[0];
536 Z.
hi ^= Htable[nlo].
hi;
537 Z.
lo ^= Htable[nlo].
lo;
539 rem = (size_t)Z.
lo&0xf;
541 Z.
lo = (Z.
hi<<60)|(Z.
lo>>4);
544 Z.
hi ^= Htable[nhi].
hi;
545 Z.
lo ^= Htable[nhi].
lo;
546 Z.
hi ^= ((
u64)rem_8bit[rem<<4])<<48;
549 if (is_endian.little) {
551 Xi[0] = BSWAP8(Z.
hi);
552 Xi[1] = BSWAP8(Z.
lo);
566 }
while (inp+=16, len-=16);
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);
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)
580 #define GHASH_CHUNK (3*1024)
585 static void gcm_gmult_1bit(
u64 Xi[2],
const u64 H[2])
590 const long *xi = (
const long *)Xi;
591 const union {
long one;
char little; } is_endian = {1};
596 for (j=0; j<16/
sizeof(long); ++j) {
597 if (is_endian.little) {
598 if (
sizeof(
long)==8) {
600 X = (long)(BSWAP8(xi[j]));
602 const u8 *p = (
const u8 *)(xi+j);
607 const u8 *p = (
const u8 *)(xi+j);
614 for (i=0; i<8*
sizeof(long); ++i, X<<=1) {
615 u64 M = (
u64)(X>>(8*
sizeof(
long)-1));
623 if (is_endian.little) {
625 Xi[0] = BSWAP8(Z.
hi);
626 Xi[1] = BSWAP8(Z.
lo);
641 #define GCM_MUL(ctx,Xi) gcm_gmult_1bit(ctx->Xi.u,ctx->H.u)
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
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);
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);
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);
666 # elif defined(__arm__) || defined(__arm)
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);
677 #ifdef GCM_FUNCREF_4BIT
679 # define GCM_MUL(ctx,Xi) (*gcm_gmult_p)(ctx->Xi.u,ctx->Htable)
682 # define GHASH(ctx,in,len) (*gcm_ghash_p)(ctx->Xi.u,ctx->Htable,in,len)
688 const union {
long one;
char little; } is_endian = {1};
690 memset(ctx,0,
sizeof(*ctx));
694 (*block)(ctx->
H.
c,ctx->
H.
c,
key);
696 if (is_endian.little) {
699 ctx->
H.
u[0] = BSWAP8(ctx->
H.
u[0]);
700 ctx->
H.
u[1] = BSWAP8(ctx->
H.
u[1]);
712 gcm_init_8bit(ctx->
Htable,ctx->
H.
u);
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) &&
717 OPENSSL_ia32cap_P[1]&(1<<1) ) {
718 gcm_init_clmul(ctx->
Htable,ctx->
H.
u);
719 ctx->
gmult = gcm_gmult_clmul;
720 ctx->
ghash = gcm_ghash_clmul;
724 gcm_init_4bit(ctx->
Htable,ctx->
H.
u);
725 # if defined(GHASH_ASM_X86)
726 # if defined(OPENSSL_IA32_SSE2)
727 if (OPENSSL_ia32cap_P[0]&(1<<25)) {
729 if (OPENSSL_ia32cap_P[0]&(1<<23)) {
731 ctx->
gmult = gcm_gmult_4bit_mmx;
732 ctx->
ghash = gcm_ghash_4bit_mmx;
734 ctx->
gmult = gcm_gmult_4bit_x86;
735 ctx->
ghash = gcm_ghash_4bit_x86;
738 ctx->
gmult = gcm_gmult_4bit;
739 ctx->
ghash = gcm_ghash_4bit;
741 # elif defined(GHASH_ASM_ARM)
743 ctx->
gmult = gcm_gmult_neon;
744 ctx->
ghash = gcm_ghash_neon;
746 gcm_init_4bit(ctx->
Htable,ctx->
H.
u);
747 ctx->
gmult = gcm_gmult_4bit;
748 ctx->
ghash = gcm_ghash_4bit;
751 gcm_init_4bit(ctx->
Htable,ctx->
H.
u);
758 const union {
long one;
char little; } is_endian = {1};
760 #ifdef GCM_FUNCREF_4BIT
774 memcpy(ctx->
Yi.
c,iv,12);
783 for (i=0; i<16; ++i) ctx->
Yi.
c[i] ^= iv[i];
789 for (i=0; i<
len; ++i) ctx->
Yi.
c[i] ^= iv[i];
793 if (is_endian.little) {
795 ctx->
Yi.
u[1] ^= BSWAP8(len0);
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);
808 ctx->
Yi.
u[1] ^= len0;
812 if (is_endian.little)
820 if (is_endian.little)
831 #ifdef GCM_FUNCREF_4BIT
834 void (*gcm_ghash_p)(
u64 Xi[2],
const u128 Htable[16],
839 if (ctx->
len.
u[1])
return -2;
842 if (alen>(
U64(1)<<61) || (
sizeof(len)==8 && alen<
len))
844 ctx->
len.
u[0] = alen;
849 ctx->
Xi.
c[n] ^= *(aad++);
861 if ((i = (len&(
size_t)-16))) {
868 for (i=0; i<16; ++i) ctx->
Xi.
c[i] ^= aad[i];
875 n = (
unsigned int)len;
876 for (i=0; i<
len; ++i) ctx->
Xi.
c[i] ^= aad[i];
884 const unsigned char *in,
unsigned char *out,
887 const union {
long one;
char little; } is_endian = {1};
892 void *key = ctx->
key;
893 #ifdef GCM_FUNCREF_4BIT
896 void (*gcm_ghash_p)(
u64 Xi[2],
const u128 Htable[16],
902 n = (
unsigned int)mlen%16;
905 if (mlen>((
U64(1)<<36)-32) || (
sizeof(len)==8 && mlen<
len))
907 ctx->
len.
u[1] = mlen;
915 if (is_endian.little)
921 #if !defined(OPENSSL_SMALL_FOOTPRINT)
922 if (16%
sizeof(
size_t) == 0)
do {
925 ctx->
Xi.
c[n] ^= *(out++) = *(in++)^ctx->
EKi.
c[n];
935 #if defined(STRICT_ALIGNMENT)
936 if (((
size_t)in|(
size_t)out)%
sizeof(
size_t) != 0)
939 #if defined(GHASH) && defined(GHASH_CHUNK)
946 if (is_endian.little)
950 for (i=0; i<16; i+=
sizeof(size_t))
952 *(
size_t *)(in+i)^*(
size_t *)(ctx->
EKi.
c+i);
960 if ((i = (len&(
size_t)-16))) {
966 if (is_endian.little)
970 for (i=0; i<16; i+=
sizeof(size_t))
972 *(
size_t *)(in+i)^*(
size_t *)(ctx->
EKi.
c+i);
983 if (is_endian.little)
987 for (i=0; i<16; i+=
sizeof(size_t))
988 *(
size_t *)(ctx->
Xi.
c+i) ^=
990 *(
size_t *)(in+i)^*(
size_t *)(ctx->
EKi.
c+i);
1000 if (is_endian.little)
1005 ctx->
Xi.
c[n] ^= out[n] = in[n]^ctx->
EKi.
c[n];
1014 for (i=0;i<
len;++i) {
1018 if (is_endian.little)
1023 ctx->
Xi.
c[n] ^= out[i] = in[i]^ctx->
EKi.
c[n];
1034 const unsigned char *in,
unsigned char *out,
1037 const union {
long one;
char little; } is_endian = {1};
1038 unsigned int n, ctr;
1042 void *key = ctx->
key;
1043 #ifdef GCM_FUNCREF_4BIT
1046 void (*gcm_ghash_p)(
u64 Xi[2],
const u128 Htable[16],
1052 if (mlen>((
U64(1)<<36)-32) || (
sizeof(len)==8 && mlen<
len))
1054 ctx->
len.
u[1] = mlen;
1062 if (is_endian.little)
1068 #if !defined(OPENSSL_SMALL_FOOTPRINT)
1069 if (16%
sizeof(
size_t) == 0)
do {
1073 *(out++) = c^ctx->
EKi.
c[n];
1084 #if defined(STRICT_ALIGNMENT)
1085 if (((
size_t)in|(
size_t)out)%
sizeof(
size_t) != 0)
1088 #if defined(GHASH) && defined(GHASH_CHUNK)
1096 if (is_endian.little)
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);
1109 if ((i = (len&(
size_t)-16))) {
1114 if (is_endian.little)
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);
1130 if (is_endian.little)
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;
1148 if (is_endian.little)
1155 out[n] = c^ctx->
EKi.
c[n];
1164 for (i=0;i<
len;++i) {
1169 if (is_endian.little)
1175 out[i] = c^ctx->
EKi.
c[n];
1187 const unsigned char *in,
unsigned char *out,
1190 const union {
long one;
char little; } is_endian = {1};
1191 unsigned int n, ctr;
1194 void *key = ctx->
key;
1195 #ifdef GCM_FUNCREF_4BIT
1198 void (*gcm_ghash_p)(
u64 Xi[2],
const u128 Htable[16],
1204 if (mlen>((
U64(1)<<36)-32) || (
sizeof(len)==8 && mlen<
len))
1206 ctx->
len.
u[1] = mlen;
1214 if (is_endian.little)
1222 ctx->
Xi.
c[n] ^= *(out++) = *(in++)^ctx->
EKi.
c[n];
1232 #if defined(GHASH) && !defined(OPENSSL_SMALL_FOOTPRINT)
1236 if (is_endian.little)
1246 if ((i = (len&(
size_t)-16))) {
1249 (*stream)(in,out,j,
key,ctx->
Yi.
c);
1250 ctr += (
unsigned int)j;
1251 if (is_endian.little)
1262 for (i=0;i<16;++i) ctx->
Xi.
c[i] ^= out[i];
1271 if (is_endian.little)
1276 ctx->
Xi.
c[n] ^= out[n] = in[n]^ctx->
EKi.
c[n];
1286 const unsigned char *in,
unsigned char *out,
1289 const union {
long one;
char little; } is_endian = {1};
1290 unsigned int n, ctr;
1293 void *key = ctx->
key;
1294 #ifdef GCM_FUNCREF_4BIT
1297 void (*gcm_ghash_p)(
u64 Xi[2],
const u128 Htable[16],
1303 if (mlen>((
U64(1)<<36)-32) || (
sizeof(len)==8 && mlen<
len))
1305 ctx->
len.
u[1] = mlen;
1313 if (is_endian.little)
1322 *(out++) = c^ctx->
EKi.
c[n];
1333 #if defined(GHASH) && !defined(OPENSSL_SMALL_FOOTPRINT)
1338 if (is_endian.little)
1347 if ((i = (len&(
size_t)-16))) {
1355 for (k=0;k<16;++k) ctx->
Xi.
c[k] ^= in[k];
1362 (*stream)(in,out,j,
key,ctx->
Yi.
c);
1363 ctr += (
unsigned int)j;
1364 if (is_endian.little)
1375 if (is_endian.little)
1382 out[n] = c^ctx->
EKi.
c[n];
1394 const union {
long one;
char little; } is_endian = {1};
1397 #ifdef GCM_FUNCREF_4BIT
1404 if (is_endian.little) {
1406 alen = BSWAP8(alen);
1407 clen = BSWAP8(clen);
1411 ctx->
len.
u[0] = alen;
1412 ctx->
len.
u[1] = clen;
1419 ctx->
Xi.
u[0] ^= alen;
1420 ctx->
Xi.
u[1] ^= clen;
1423 ctx->
Xi.
u[0] ^= ctx->
EK0.
u[0];
1424 ctx->
Xi.
u[1] ^= ctx->
EK0.
u[1];
1426 if (tag && len<=
sizeof(ctx->
Xi))
1427 return memcmp(ctx->
Xi.
c,tag,len);
1435 memcpy(tag, ctx->
Xi.
c, len<=
sizeof(ctx->
Xi.
c)?len:
sizeof(ctx->
Xi.
c));
1456 #if defined(SELFTEST)
1461 static const u8 K1[16],
1466 T1[]= {0x58,0xe2,0xfc,0xce,0xfa,0x7e,0x30,0x61,0x36,0x7f,0x1d,0x57,0xa4,0xe7,0x45,0x5a};
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};
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};
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};
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};
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};
1531 static const u8 K7[24],
1536 T7[]= {0xcd,0x33,0xb2,0x8a,0xc7,0x73,0xf7,0x4b,0xa0,0x0e,0xd1,0xf3,0x12,0x57,0x24,0x35};
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};
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};
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};
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};
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};
1602 static const u8 K13[32],
1607 T13[]={0x53,0x0f,0x8a,0xfb,0xc7,0x45,0x36,0xb9,0xa9,0x63,0xb4,0xf1,0xc4,0xcb,0x73,0x8b};
1612 static const u8 P14[16],
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};
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};
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};
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};
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};
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); \
1717 #ifdef OPENSSL_CPUID_OBJ
1720 union {
u64 u;
u8 c[1024]; } buf;
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));
1746 GHASH(&ctx,buf.
c,
sizeof(buf));
1748 for (i=0;i<100;++i)
GHASH(&ctx,buf.
c,
sizeof(buf));
1750 printf(
"%.2f\n",gcm_t/(
double)
sizeof(buf)/(
double)i);