mirror of
https://github.com/Laupetin/OpenAssetTools.git
synced 2025-06-10 23:08:05 -05:00
Import code from previous AssetBuilder version
This commit is contained in:
124
thirdparty/libtomcrypt/encauth/gcm/gcm_add_aad.c
vendored
Normal file
124
thirdparty/libtomcrypt/encauth/gcm/gcm_add_aad.c
vendored
Normal file
@ -0,0 +1,124 @@
|
||||
/* LibTomCrypt, modular cryptographic library -- Tom St Denis
|
||||
*
|
||||
* LibTomCrypt is a library that provides various cryptographic
|
||||
* algorithms in a highly modular and flexible manner.
|
||||
*
|
||||
* The library is free for all purposes without any express
|
||||
* guarantee it works.
|
||||
*/
|
||||
|
||||
/**
|
||||
@file gcm_add_aad.c
|
||||
GCM implementation, Add AAD data to the stream, by Tom St Denis
|
||||
*/
|
||||
#include "tomcrypt.h"
|
||||
|
||||
#ifdef LTC_GCM_MODE
|
||||
|
||||
/**
|
||||
Add AAD to the GCM state
|
||||
@param gcm The GCM state
|
||||
@param adata The additional authentication data to add to the GCM state
|
||||
@param adatalen The length of the AAD data.
|
||||
@return CRYPT_OK on success
|
||||
*/
|
||||
int gcm_add_aad(gcm_state *gcm,
|
||||
const unsigned char *adata, unsigned long adatalen)
|
||||
{
|
||||
unsigned long x;
|
||||
int err;
|
||||
#ifdef LTC_FAST
|
||||
unsigned long y;
|
||||
#endif
|
||||
|
||||
LTC_ARGCHK(gcm != NULL);
|
||||
if (adatalen > 0) {
|
||||
LTC_ARGCHK(adata != NULL);
|
||||
}
|
||||
|
||||
if (gcm->buflen > 16 || gcm->buflen < 0) {
|
||||
return CRYPT_INVALID_ARG;
|
||||
}
|
||||
|
||||
if ((err = cipher_is_valid(gcm->cipher)) != CRYPT_OK) {
|
||||
return err;
|
||||
}
|
||||
|
||||
/* in IV mode? */
|
||||
if (gcm->mode == LTC_GCM_MODE_IV) {
|
||||
/* IV length must be > 0 */
|
||||
if (gcm->buflen == 0 && gcm->totlen == 0) return CRYPT_ERROR;
|
||||
/* let's process the IV */
|
||||
if (gcm->ivmode || gcm->buflen != 12) {
|
||||
for (x = 0; x < (unsigned long)gcm->buflen; x++) {
|
||||
gcm->X[x] ^= gcm->buf[x];
|
||||
}
|
||||
if (gcm->buflen) {
|
||||
gcm->totlen += gcm->buflen * CONST64(8);
|
||||
gcm_mult_h(gcm, gcm->X);
|
||||
}
|
||||
|
||||
/* mix in the length */
|
||||
zeromem(gcm->buf, 8);
|
||||
STORE64H(gcm->totlen, gcm->buf+8);
|
||||
for (x = 0; x < 16; x++) {
|
||||
gcm->X[x] ^= gcm->buf[x];
|
||||
}
|
||||
gcm_mult_h(gcm, gcm->X);
|
||||
|
||||
/* copy counter out */
|
||||
XMEMCPY(gcm->Y, gcm->X, 16);
|
||||
zeromem(gcm->X, 16);
|
||||
} else {
|
||||
XMEMCPY(gcm->Y, gcm->buf, 12);
|
||||
gcm->Y[12] = 0;
|
||||
gcm->Y[13] = 0;
|
||||
gcm->Y[14] = 0;
|
||||
gcm->Y[15] = 1;
|
||||
}
|
||||
XMEMCPY(gcm->Y_0, gcm->Y, 16);
|
||||
zeromem(gcm->buf, 16);
|
||||
gcm->buflen = 0;
|
||||
gcm->totlen = 0;
|
||||
gcm->mode = LTC_GCM_MODE_AAD;
|
||||
}
|
||||
|
||||
if (gcm->mode != LTC_GCM_MODE_AAD || gcm->buflen >= 16) {
|
||||
return CRYPT_INVALID_ARG;
|
||||
}
|
||||
|
||||
x = 0;
|
||||
#ifdef LTC_FAST
|
||||
if (gcm->buflen == 0) {
|
||||
for (x = 0; x < (adatalen & ~15); x += 16) {
|
||||
for (y = 0; y < 16; y += sizeof(LTC_FAST_TYPE)) {
|
||||
*(LTC_FAST_TYPE_PTR_CAST(&gcm->X[y])) ^= *(LTC_FAST_TYPE_PTR_CAST(&adata[x + y]));
|
||||
}
|
||||
gcm_mult_h(gcm, gcm->X);
|
||||
gcm->totlen += 128;
|
||||
}
|
||||
adata += x;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/* start adding AAD data to the state */
|
||||
for (; x < adatalen; x++) {
|
||||
gcm->X[gcm->buflen++] ^= *adata++;
|
||||
|
||||
if (gcm->buflen == 16) {
|
||||
/* GF mult it */
|
||||
gcm_mult_h(gcm, gcm->X);
|
||||
gcm->buflen = 0;
|
||||
gcm->totlen += 128;
|
||||
}
|
||||
}
|
||||
|
||||
return CRYPT_OK;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/* ref: HEAD -> master, tag: v1.18.2 */
|
||||
/* git commit: 7e7eb695d581782f04b24dc444cbfde86af59853 */
|
||||
/* commit time: 2018-07-01 22:49:01 +0200 */
|
92
thirdparty/libtomcrypt/encauth/gcm/gcm_add_iv.c
vendored
Normal file
92
thirdparty/libtomcrypt/encauth/gcm/gcm_add_iv.c
vendored
Normal file
@ -0,0 +1,92 @@
|
||||
/* LibTomCrypt, modular cryptographic library -- Tom St Denis
|
||||
*
|
||||
* LibTomCrypt is a library that provides various cryptographic
|
||||
* algorithms in a highly modular and flexible manner.
|
||||
*
|
||||
* The library is free for all purposes without any express
|
||||
* guarantee it works.
|
||||
*/
|
||||
|
||||
/**
|
||||
@file gcm_add_iv.c
|
||||
GCM implementation, add IV data to the state, by Tom St Denis
|
||||
*/
|
||||
#include "tomcrypt.h"
|
||||
|
||||
#ifdef LTC_GCM_MODE
|
||||
|
||||
/**
|
||||
Add IV data to the GCM state
|
||||
@param gcm The GCM state
|
||||
@param IV The initial value data to add
|
||||
@param IVlen The length of the IV
|
||||
@return CRYPT_OK on success
|
||||
*/
|
||||
int gcm_add_iv(gcm_state *gcm,
|
||||
const unsigned char *IV, unsigned long IVlen)
|
||||
{
|
||||
unsigned long x, y;
|
||||
int err;
|
||||
|
||||
LTC_ARGCHK(gcm != NULL);
|
||||
if (IVlen > 0) {
|
||||
LTC_ARGCHK(IV != NULL);
|
||||
}
|
||||
|
||||
/* must be in IV mode */
|
||||
if (gcm->mode != LTC_GCM_MODE_IV) {
|
||||
return CRYPT_INVALID_ARG;
|
||||
}
|
||||
|
||||
if (gcm->buflen >= 16 || gcm->buflen < 0) {
|
||||
return CRYPT_INVALID_ARG;
|
||||
}
|
||||
|
||||
if ((err = cipher_is_valid(gcm->cipher)) != CRYPT_OK) {
|
||||
return err;
|
||||
}
|
||||
|
||||
|
||||
/* trip the ivmode flag */
|
||||
if (IVlen + gcm->buflen > 12) {
|
||||
gcm->ivmode |= 1;
|
||||
}
|
||||
|
||||
x = 0;
|
||||
#ifdef LTC_FAST
|
||||
if (gcm->buflen == 0) {
|
||||
for (x = 0; x < (IVlen & ~15); x += 16) {
|
||||
for (y = 0; y < 16; y += sizeof(LTC_FAST_TYPE)) {
|
||||
*(LTC_FAST_TYPE_PTR_CAST(&gcm->X[y])) ^= *(LTC_FAST_TYPE_PTR_CAST(&IV[x + y]));
|
||||
}
|
||||
gcm_mult_h(gcm, gcm->X);
|
||||
gcm->totlen += 128;
|
||||
}
|
||||
IV += x;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* start adding IV data to the state */
|
||||
for (; x < IVlen; x++) {
|
||||
gcm->buf[gcm->buflen++] = *IV++;
|
||||
|
||||
if (gcm->buflen == 16) {
|
||||
/* GF mult it */
|
||||
for (y = 0; y < 16; y++) {
|
||||
gcm->X[y] ^= gcm->buf[y];
|
||||
}
|
||||
gcm_mult_h(gcm, gcm->X);
|
||||
gcm->buflen = 0;
|
||||
gcm->totlen += 128;
|
||||
}
|
||||
}
|
||||
|
||||
return CRYPT_OK;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
/* ref: HEAD -> master, tag: v1.18.2 */
|
||||
/* git commit: 7e7eb695d581782f04b24dc444cbfde86af59853 */
|
||||
/* commit time: 2018-07-01 22:49:01 +0200 */
|
90
thirdparty/libtomcrypt/encauth/gcm/gcm_done.c
vendored
Normal file
90
thirdparty/libtomcrypt/encauth/gcm/gcm_done.c
vendored
Normal file
@ -0,0 +1,90 @@
|
||||
/* LibTomCrypt, modular cryptographic library -- Tom St Denis
|
||||
*
|
||||
* LibTomCrypt is a library that provides various cryptographic
|
||||
* algorithms in a highly modular and flexible manner.
|
||||
*
|
||||
* The library is free for all purposes without any express
|
||||
* guarantee it works.
|
||||
*/
|
||||
|
||||
/**
|
||||
@file gcm_done.c
|
||||
GCM implementation, Terminate the stream, by Tom St Denis
|
||||
*/
|
||||
#include "tomcrypt.h"
|
||||
|
||||
#ifdef LTC_GCM_MODE
|
||||
|
||||
/**
|
||||
Terminate a GCM stream
|
||||
@param gcm The GCM state
|
||||
@param tag [out] The destination for the MAC tag
|
||||
@param taglen [in/out] The length of the MAC tag
|
||||
@return CRYPT_OK on success
|
||||
*/
|
||||
int gcm_done(gcm_state *gcm,
|
||||
unsigned char *tag, unsigned long *taglen)
|
||||
{
|
||||
unsigned long x;
|
||||
int err;
|
||||
|
||||
LTC_ARGCHK(gcm != NULL);
|
||||
LTC_ARGCHK(tag != NULL);
|
||||
LTC_ARGCHK(taglen != NULL);
|
||||
|
||||
if (gcm->buflen > 16 || gcm->buflen < 0) {
|
||||
return CRYPT_INVALID_ARG;
|
||||
}
|
||||
|
||||
if ((err = cipher_is_valid(gcm->cipher)) != CRYPT_OK) {
|
||||
return err;
|
||||
}
|
||||
|
||||
if (gcm->mode == LTC_GCM_MODE_IV) {
|
||||
/* let's process the IV */
|
||||
if ((err = gcm_add_aad(gcm, NULL, 0)) != CRYPT_OK) return err;
|
||||
}
|
||||
|
||||
if (gcm->mode == LTC_GCM_MODE_AAD) {
|
||||
/* let's process the AAD */
|
||||
if ((err = gcm_process(gcm, NULL, 0, NULL, 0)) != CRYPT_OK) return err;
|
||||
}
|
||||
|
||||
if (gcm->mode != LTC_GCM_MODE_TEXT) {
|
||||
return CRYPT_INVALID_ARG;
|
||||
}
|
||||
|
||||
/* handle remaining ciphertext */
|
||||
if (gcm->buflen) {
|
||||
gcm->pttotlen += gcm->buflen * CONST64(8);
|
||||
gcm_mult_h(gcm, gcm->X);
|
||||
}
|
||||
|
||||
/* length */
|
||||
STORE64H(gcm->totlen, gcm->buf);
|
||||
STORE64H(gcm->pttotlen, gcm->buf+8);
|
||||
for (x = 0; x < 16; x++) {
|
||||
gcm->X[x] ^= gcm->buf[x];
|
||||
}
|
||||
gcm_mult_h(gcm, gcm->X);
|
||||
|
||||
/* encrypt original counter */
|
||||
if ((err = cipher_descriptor[gcm->cipher].ecb_encrypt(gcm->Y_0, gcm->buf, &gcm->K)) != CRYPT_OK) {
|
||||
return err;
|
||||
}
|
||||
for (x = 0; x < 16 && x < *taglen; x++) {
|
||||
tag[x] = gcm->buf[x] ^ gcm->X[x];
|
||||
}
|
||||
*taglen = x;
|
||||
|
||||
cipher_descriptor[gcm->cipher].done(&gcm->K);
|
||||
|
||||
return CRYPT_OK;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
/* ref: HEAD -> master, tag: v1.18.2 */
|
||||
/* git commit: 7e7eb695d581782f04b24dc444cbfde86af59853 */
|
||||
/* commit time: 2018-07-01 22:49:01 +0200 */
|
219
thirdparty/libtomcrypt/encauth/gcm/gcm_gf_mult.c
vendored
Normal file
219
thirdparty/libtomcrypt/encauth/gcm/gcm_gf_mult.c
vendored
Normal file
@ -0,0 +1,219 @@
|
||||
/* LibTomCrypt, modular cryptographic library -- Tom St Denis
|
||||
*
|
||||
* LibTomCrypt is a library that provides various cryptographic
|
||||
* algorithms in a highly modular and flexible manner.
|
||||
*
|
||||
* The library is free for all purposes without any express
|
||||
* guarantee it works.
|
||||
*/
|
||||
|
||||
/**
|
||||
@file gcm_gf_mult.c
|
||||
GCM implementation, do the GF mult, by Tom St Denis
|
||||
*/
|
||||
#include "tomcrypt.h"
|
||||
|
||||
#if defined(LTC_GCM_TABLES) || defined(LTC_LRW_TABLES) || ((defined(LTC_GCM_MODE) || defined(LTC_GCM_MODE)) && defined(LTC_FAST))
|
||||
|
||||
/* this is x*2^128 mod p(x) ... the results are 16 bytes each stored in a packed format. Since only the
|
||||
* lower 16 bits are not zero'ed I removed the upper 14 bytes */
|
||||
const unsigned char gcm_shift_table[256*2] = {
|
||||
0x00, 0x00, 0x01, 0xc2, 0x03, 0x84, 0x02, 0x46, 0x07, 0x08, 0x06, 0xca, 0x04, 0x8c, 0x05, 0x4e,
|
||||
0x0e, 0x10, 0x0f, 0xd2, 0x0d, 0x94, 0x0c, 0x56, 0x09, 0x18, 0x08, 0xda, 0x0a, 0x9c, 0x0b, 0x5e,
|
||||
0x1c, 0x20, 0x1d, 0xe2, 0x1f, 0xa4, 0x1e, 0x66, 0x1b, 0x28, 0x1a, 0xea, 0x18, 0xac, 0x19, 0x6e,
|
||||
0x12, 0x30, 0x13, 0xf2, 0x11, 0xb4, 0x10, 0x76, 0x15, 0x38, 0x14, 0xfa, 0x16, 0xbc, 0x17, 0x7e,
|
||||
0x38, 0x40, 0x39, 0x82, 0x3b, 0xc4, 0x3a, 0x06, 0x3f, 0x48, 0x3e, 0x8a, 0x3c, 0xcc, 0x3d, 0x0e,
|
||||
0x36, 0x50, 0x37, 0x92, 0x35, 0xd4, 0x34, 0x16, 0x31, 0x58, 0x30, 0x9a, 0x32, 0xdc, 0x33, 0x1e,
|
||||
0x24, 0x60, 0x25, 0xa2, 0x27, 0xe4, 0x26, 0x26, 0x23, 0x68, 0x22, 0xaa, 0x20, 0xec, 0x21, 0x2e,
|
||||
0x2a, 0x70, 0x2b, 0xb2, 0x29, 0xf4, 0x28, 0x36, 0x2d, 0x78, 0x2c, 0xba, 0x2e, 0xfc, 0x2f, 0x3e,
|
||||
0x70, 0x80, 0x71, 0x42, 0x73, 0x04, 0x72, 0xc6, 0x77, 0x88, 0x76, 0x4a, 0x74, 0x0c, 0x75, 0xce,
|
||||
0x7e, 0x90, 0x7f, 0x52, 0x7d, 0x14, 0x7c, 0xd6, 0x79, 0x98, 0x78, 0x5a, 0x7a, 0x1c, 0x7b, 0xde,
|
||||
0x6c, 0xa0, 0x6d, 0x62, 0x6f, 0x24, 0x6e, 0xe6, 0x6b, 0xa8, 0x6a, 0x6a, 0x68, 0x2c, 0x69, 0xee,
|
||||
0x62, 0xb0, 0x63, 0x72, 0x61, 0x34, 0x60, 0xf6, 0x65, 0xb8, 0x64, 0x7a, 0x66, 0x3c, 0x67, 0xfe,
|
||||
0x48, 0xc0, 0x49, 0x02, 0x4b, 0x44, 0x4a, 0x86, 0x4f, 0xc8, 0x4e, 0x0a, 0x4c, 0x4c, 0x4d, 0x8e,
|
||||
0x46, 0xd0, 0x47, 0x12, 0x45, 0x54, 0x44, 0x96, 0x41, 0xd8, 0x40, 0x1a, 0x42, 0x5c, 0x43, 0x9e,
|
||||
0x54, 0xe0, 0x55, 0x22, 0x57, 0x64, 0x56, 0xa6, 0x53, 0xe8, 0x52, 0x2a, 0x50, 0x6c, 0x51, 0xae,
|
||||
0x5a, 0xf0, 0x5b, 0x32, 0x59, 0x74, 0x58, 0xb6, 0x5d, 0xf8, 0x5c, 0x3a, 0x5e, 0x7c, 0x5f, 0xbe,
|
||||
0xe1, 0x00, 0xe0, 0xc2, 0xe2, 0x84, 0xe3, 0x46, 0xe6, 0x08, 0xe7, 0xca, 0xe5, 0x8c, 0xe4, 0x4e,
|
||||
0xef, 0x10, 0xee, 0xd2, 0xec, 0x94, 0xed, 0x56, 0xe8, 0x18, 0xe9, 0xda, 0xeb, 0x9c, 0xea, 0x5e,
|
||||
0xfd, 0x20, 0xfc, 0xe2, 0xfe, 0xa4, 0xff, 0x66, 0xfa, 0x28, 0xfb, 0xea, 0xf9, 0xac, 0xf8, 0x6e,
|
||||
0xf3, 0x30, 0xf2, 0xf2, 0xf0, 0xb4, 0xf1, 0x76, 0xf4, 0x38, 0xf5, 0xfa, 0xf7, 0xbc, 0xf6, 0x7e,
|
||||
0xd9, 0x40, 0xd8, 0x82, 0xda, 0xc4, 0xdb, 0x06, 0xde, 0x48, 0xdf, 0x8a, 0xdd, 0xcc, 0xdc, 0x0e,
|
||||
0xd7, 0x50, 0xd6, 0x92, 0xd4, 0xd4, 0xd5, 0x16, 0xd0, 0x58, 0xd1, 0x9a, 0xd3, 0xdc, 0xd2, 0x1e,
|
||||
0xc5, 0x60, 0xc4, 0xa2, 0xc6, 0xe4, 0xc7, 0x26, 0xc2, 0x68, 0xc3, 0xaa, 0xc1, 0xec, 0xc0, 0x2e,
|
||||
0xcb, 0x70, 0xca, 0xb2, 0xc8, 0xf4, 0xc9, 0x36, 0xcc, 0x78, 0xcd, 0xba, 0xcf, 0xfc, 0xce, 0x3e,
|
||||
0x91, 0x80, 0x90, 0x42, 0x92, 0x04, 0x93, 0xc6, 0x96, 0x88, 0x97, 0x4a, 0x95, 0x0c, 0x94, 0xce,
|
||||
0x9f, 0x90, 0x9e, 0x52, 0x9c, 0x14, 0x9d, 0xd6, 0x98, 0x98, 0x99, 0x5a, 0x9b, 0x1c, 0x9a, 0xde,
|
||||
0x8d, 0xa0, 0x8c, 0x62, 0x8e, 0x24, 0x8f, 0xe6, 0x8a, 0xa8, 0x8b, 0x6a, 0x89, 0x2c, 0x88, 0xee,
|
||||
0x83, 0xb0, 0x82, 0x72, 0x80, 0x34, 0x81, 0xf6, 0x84, 0xb8, 0x85, 0x7a, 0x87, 0x3c, 0x86, 0xfe,
|
||||
0xa9, 0xc0, 0xa8, 0x02, 0xaa, 0x44, 0xab, 0x86, 0xae, 0xc8, 0xaf, 0x0a, 0xad, 0x4c, 0xac, 0x8e,
|
||||
0xa7, 0xd0, 0xa6, 0x12, 0xa4, 0x54, 0xa5, 0x96, 0xa0, 0xd8, 0xa1, 0x1a, 0xa3, 0x5c, 0xa2, 0x9e,
|
||||
0xb5, 0xe0, 0xb4, 0x22, 0xb6, 0x64, 0xb7, 0xa6, 0xb2, 0xe8, 0xb3, 0x2a, 0xb1, 0x6c, 0xb0, 0xae,
|
||||
0xbb, 0xf0, 0xba, 0x32, 0xb8, 0x74, 0xb9, 0xb6, 0xbc, 0xf8, 0xbd, 0x3a, 0xbf, 0x7c, 0xbe, 0xbe };
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
#if defined(LTC_GCM_MODE) || defined(LRW_MODE)
|
||||
|
||||
#ifndef LTC_FAST
|
||||
/* right shift */
|
||||
static void _gcm_rightshift(unsigned char *a)
|
||||
{
|
||||
int x;
|
||||
for (x = 15; x > 0; x--) {
|
||||
a[x] = (a[x]>>1) | ((a[x-1]<<7)&0x80);
|
||||
}
|
||||
a[0] >>= 1;
|
||||
}
|
||||
|
||||
/* c = b*a */
|
||||
static const unsigned char mask[] = { 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01 };
|
||||
static const unsigned char poly[] = { 0x00, 0xE1 };
|
||||
|
||||
|
||||
/**
|
||||
GCM GF multiplier (internal use only) bitserial
|
||||
@param a First value
|
||||
@param b Second value
|
||||
@param c Destination for a * b
|
||||
*/
|
||||
void gcm_gf_mult(const unsigned char *a, const unsigned char *b, unsigned char *c)
|
||||
{
|
||||
unsigned char Z[16], V[16];
|
||||
unsigned char x, y, z;
|
||||
|
||||
zeromem(Z, 16);
|
||||
XMEMCPY(V, a, 16);
|
||||
for (x = 0; x < 128; x++) {
|
||||
if (b[x>>3] & mask[x&7]) {
|
||||
for (y = 0; y < 16; y++) {
|
||||
Z[y] ^= V[y];
|
||||
}
|
||||
}
|
||||
z = V[15] & 0x01;
|
||||
_gcm_rightshift(V);
|
||||
V[0] ^= poly[z];
|
||||
}
|
||||
XMEMCPY(c, Z, 16);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
/* map normal numbers to "ieee" way ... e.g. bit reversed */
|
||||
#define M(x) ( ((x&8)>>3) | ((x&4)>>1) | ((x&2)<<1) | ((x&1)<<3) )
|
||||
|
||||
#define BPD (sizeof(LTC_FAST_TYPE) * 8)
|
||||
#define WPV (1 + (16 / sizeof(LTC_FAST_TYPE)))
|
||||
|
||||
/**
|
||||
GCM GF multiplier (internal use only) word oriented
|
||||
@param a First value
|
||||
@param b Second value
|
||||
@param c Destination for a * b
|
||||
*/
|
||||
void gcm_gf_mult(const unsigned char *a, const unsigned char *b, unsigned char *c)
|
||||
{
|
||||
int i, j, k, u;
|
||||
LTC_FAST_TYPE B[16][WPV], tmp[32 / sizeof(LTC_FAST_TYPE)], pB[16 / sizeof(LTC_FAST_TYPE)], zz, z;
|
||||
unsigned char pTmp[32];
|
||||
|
||||
/* create simple tables */
|
||||
zeromem(B[0], sizeof(B[0]));
|
||||
zeromem(B[M(1)], sizeof(B[M(1)]));
|
||||
|
||||
#ifdef ENDIAN_32BITWORD
|
||||
for (i = 0; i < 4; i++) {
|
||||
LOAD32H(B[M(1)][i], a + (i<<2));
|
||||
LOAD32L(pB[i], b + (i<<2));
|
||||
}
|
||||
#else
|
||||
for (i = 0; i < 2; i++) {
|
||||
LOAD64H(B[M(1)][i], a + (i<<3));
|
||||
LOAD64L(pB[i], b + (i<<3));
|
||||
}
|
||||
#endif
|
||||
|
||||
/* now create 2, 4 and 8 */
|
||||
B[M(2)][0] = B[M(1)][0] >> 1;
|
||||
B[M(4)][0] = B[M(1)][0] >> 2;
|
||||
B[M(8)][0] = B[M(1)][0] >> 3;
|
||||
for (i = 1; i < (int)WPV; i++) {
|
||||
B[M(2)][i] = (B[M(1)][i-1] << (BPD-1)) | (B[M(1)][i] >> 1);
|
||||
B[M(4)][i] = (B[M(1)][i-1] << (BPD-2)) | (B[M(1)][i] >> 2);
|
||||
B[M(8)][i] = (B[M(1)][i-1] << (BPD-3)) | (B[M(1)][i] >> 3);
|
||||
}
|
||||
|
||||
/* now all values with two bits which are 3, 5, 6, 9, 10, 12 */
|
||||
for (i = 0; i < (int)WPV; i++) {
|
||||
B[M(3)][i] = B[M(1)][i] ^ B[M(2)][i];
|
||||
B[M(5)][i] = B[M(1)][i] ^ B[M(4)][i];
|
||||
B[M(6)][i] = B[M(2)][i] ^ B[M(4)][i];
|
||||
B[M(9)][i] = B[M(1)][i] ^ B[M(8)][i];
|
||||
B[M(10)][i] = B[M(2)][i] ^ B[M(8)][i];
|
||||
B[M(12)][i] = B[M(8)][i] ^ B[M(4)][i];
|
||||
|
||||
/* now all 3 bit values and the only 4 bit value: 7, 11, 13, 14, 15 */
|
||||
B[M(7)][i] = B[M(3)][i] ^ B[M(4)][i];
|
||||
B[M(11)][i] = B[M(3)][i] ^ B[M(8)][i];
|
||||
B[M(13)][i] = B[M(1)][i] ^ B[M(12)][i];
|
||||
B[M(14)][i] = B[M(6)][i] ^ B[M(8)][i];
|
||||
B[M(15)][i] = B[M(7)][i] ^ B[M(8)][i];
|
||||
}
|
||||
|
||||
zeromem(tmp, sizeof(tmp));
|
||||
|
||||
/* compute product four bits of each word at a time */
|
||||
/* for each nibble */
|
||||
for (i = (BPD/4)-1; i >= 0; i--) {
|
||||
/* for each word */
|
||||
for (j = 0; j < (int)(WPV-1); j++) {
|
||||
/* grab the 4 bits recall the nibbles are backwards so it's a shift by (i^1)*4 */
|
||||
u = (pB[j] >> ((i^1)<<2)) & 15;
|
||||
|
||||
/* add offset by the word count the table looked up value to the result */
|
||||
for (k = 0; k < (int)WPV; k++) {
|
||||
tmp[k+j] ^= B[u][k];
|
||||
}
|
||||
}
|
||||
/* shift result up by 4 bits */
|
||||
if (i != 0) {
|
||||
for (z = j = 0; j < (int)(32 / sizeof(LTC_FAST_TYPE)); j++) {
|
||||
zz = tmp[j] << (BPD-4);
|
||||
tmp[j] = (tmp[j] >> 4) | z;
|
||||
z = zz;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* store product */
|
||||
#ifdef ENDIAN_32BITWORD
|
||||
for (i = 0; i < 8; i++) {
|
||||
STORE32H(tmp[i], pTmp + (i<<2));
|
||||
}
|
||||
#else
|
||||
for (i = 0; i < 4; i++) {
|
||||
STORE64H(tmp[i], pTmp + (i<<3));
|
||||
}
|
||||
#endif
|
||||
|
||||
/* reduce by taking most significant byte and adding the appropriate two byte sequence 16 bytes down */
|
||||
for (i = 31; i >= 16; i--) {
|
||||
pTmp[i-16] ^= gcm_shift_table[((unsigned)pTmp[i]<<1)];
|
||||
pTmp[i-15] ^= gcm_shift_table[((unsigned)pTmp[i]<<1)+1];
|
||||
}
|
||||
|
||||
for (i = 0; i < 16; i++) {
|
||||
c[i] = pTmp[i];
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
/* ref: HEAD -> master, tag: v1.18.2 */
|
||||
/* git commit: 7e7eb695d581782f04b24dc444cbfde86af59853 */
|
||||
/* commit time: 2018-07-01 22:49:01 +0200 */
|
||||
|
105
thirdparty/libtomcrypt/encauth/gcm/gcm_init.c
vendored
Normal file
105
thirdparty/libtomcrypt/encauth/gcm/gcm_init.c
vendored
Normal file
@ -0,0 +1,105 @@
|
||||
/* LibTomCrypt, modular cryptographic library -- Tom St Denis
|
||||
*
|
||||
* LibTomCrypt is a library that provides various cryptographic
|
||||
* algorithms in a highly modular and flexible manner.
|
||||
*
|
||||
* The library is free for all purposes without any express
|
||||
* guarantee it works.
|
||||
*/
|
||||
|
||||
/**
|
||||
@file gcm_init.c
|
||||
GCM implementation, initialize state, by Tom St Denis
|
||||
*/
|
||||
#include "tomcrypt.h"
|
||||
|
||||
#ifdef LTC_GCM_MODE
|
||||
|
||||
/**
|
||||
Initialize a GCM state
|
||||
@param gcm The GCM state to initialize
|
||||
@param cipher The index of the cipher to use
|
||||
@param key The secret key
|
||||
@param keylen The length of the secret key
|
||||
@return CRYPT_OK on success
|
||||
*/
|
||||
int gcm_init(gcm_state *gcm, int cipher,
|
||||
const unsigned char *key, int keylen)
|
||||
{
|
||||
int err;
|
||||
unsigned char B[16];
|
||||
#ifdef LTC_GCM_TABLES
|
||||
int x, y, z, t;
|
||||
#endif
|
||||
|
||||
LTC_ARGCHK(gcm != NULL);
|
||||
LTC_ARGCHK(key != NULL);
|
||||
|
||||
#ifdef LTC_FAST
|
||||
if (16 % sizeof(LTC_FAST_TYPE)) {
|
||||
return CRYPT_INVALID_ARG;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* is cipher valid? */
|
||||
if ((err = cipher_is_valid(cipher)) != CRYPT_OK) {
|
||||
return err;
|
||||
}
|
||||
if (cipher_descriptor[cipher].block_length != 16) {
|
||||
return CRYPT_INVALID_CIPHER;
|
||||
}
|
||||
|
||||
/* schedule key */
|
||||
if ((err = cipher_descriptor[cipher].setup(key, keylen, 0, &gcm->K)) != CRYPT_OK) {
|
||||
return err;
|
||||
}
|
||||
|
||||
/* H = E(0) */
|
||||
zeromem(B, 16);
|
||||
if ((err = cipher_descriptor[cipher].ecb_encrypt(B, gcm->H, &gcm->K)) != CRYPT_OK) {
|
||||
return err;
|
||||
}
|
||||
|
||||
/* setup state */
|
||||
zeromem(gcm->buf, sizeof(gcm->buf));
|
||||
zeromem(gcm->X, sizeof(gcm->X));
|
||||
gcm->cipher = cipher;
|
||||
gcm->mode = LTC_GCM_MODE_IV;
|
||||
gcm->ivmode = 0;
|
||||
gcm->buflen = 0;
|
||||
gcm->totlen = 0;
|
||||
gcm->pttotlen = 0;
|
||||
|
||||
#ifdef LTC_GCM_TABLES
|
||||
/* setup tables */
|
||||
|
||||
/* generate the first table as it has no shifting (from which we make the other tables) */
|
||||
zeromem(B, 16);
|
||||
for (y = 0; y < 256; y++) {
|
||||
B[0] = y;
|
||||
gcm_gf_mult(gcm->H, B, &gcm->PC[0][y][0]);
|
||||
}
|
||||
|
||||
/* now generate the rest of the tables based the previous table */
|
||||
for (x = 1; x < 16; x++) {
|
||||
for (y = 0; y < 256; y++) {
|
||||
/* now shift it right by 8 bits */
|
||||
t = gcm->PC[x-1][y][15];
|
||||
for (z = 15; z > 0; z--) {
|
||||
gcm->PC[x][y][z] = gcm->PC[x-1][y][z-1];
|
||||
}
|
||||
gcm->PC[x][y][0] = gcm_shift_table[t<<1];
|
||||
gcm->PC[x][y][1] ^= gcm_shift_table[(t<<1)+1];
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
return CRYPT_OK;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/* ref: HEAD -> master, tag: v1.18.2 */
|
||||
/* git commit: 7e7eb695d581782f04b24dc444cbfde86af59853 */
|
||||
/* commit time: 2018-07-01 22:49:01 +0200 */
|
106
thirdparty/libtomcrypt/encauth/gcm/gcm_memory.c
vendored
Normal file
106
thirdparty/libtomcrypt/encauth/gcm/gcm_memory.c
vendored
Normal file
@ -0,0 +1,106 @@
|
||||
/* LibTomCrypt, modular cryptographic library -- Tom St Denis
|
||||
*
|
||||
* LibTomCrypt is a library that provides various cryptographic
|
||||
* algorithms in a highly modular and flexible manner.
|
||||
*
|
||||
* The library is free for all purposes without any express
|
||||
* guarantee it works.
|
||||
*/
|
||||
|
||||
/**
|
||||
@file gcm_memory.c
|
||||
GCM implementation, process a packet, by Tom St Denis
|
||||
*/
|
||||
#include "tomcrypt.h"
|
||||
|
||||
#ifdef LTC_GCM_MODE
|
||||
|
||||
/**
|
||||
Process an entire GCM packet in one call.
|
||||
@param cipher Index of cipher to use
|
||||
@param key The secret key
|
||||
@param keylen The length of the secret key
|
||||
@param IV The initialization vector
|
||||
@param IVlen The length of the initialization vector
|
||||
@param adata The additional authentication data (header)
|
||||
@param adatalen The length of the adata
|
||||
@param pt The plaintext
|
||||
@param ptlen The length of the plaintext (ciphertext length is the same)
|
||||
@param ct The ciphertext
|
||||
@param tag [out] The MAC tag
|
||||
@param taglen [in/out] The MAC tag length
|
||||
@param direction Encrypt or Decrypt mode (GCM_ENCRYPT or GCM_DECRYPT)
|
||||
@return CRYPT_OK on success
|
||||
*/
|
||||
int gcm_memory( int cipher,
|
||||
const unsigned char *key, unsigned long keylen,
|
||||
const unsigned char *IV, unsigned long IVlen,
|
||||
const unsigned char *adata, unsigned long adatalen,
|
||||
unsigned char *pt, unsigned long ptlen,
|
||||
unsigned char *ct,
|
||||
unsigned char *tag, unsigned long *taglen,
|
||||
int direction)
|
||||
{
|
||||
void *orig;
|
||||
gcm_state *gcm;
|
||||
int err;
|
||||
|
||||
if ((err = cipher_is_valid(cipher)) != CRYPT_OK) {
|
||||
return err;
|
||||
}
|
||||
|
||||
if (cipher_descriptor[cipher].accel_gcm_memory != NULL) {
|
||||
return cipher_descriptor[cipher].accel_gcm_memory
|
||||
(key, keylen,
|
||||
IV, IVlen,
|
||||
adata, adatalen,
|
||||
pt, ptlen,
|
||||
ct,
|
||||
tag, taglen,
|
||||
direction);
|
||||
}
|
||||
|
||||
|
||||
|
||||
#ifndef LTC_GCM_TABLES_SSE2
|
||||
orig = gcm = XMALLOC(sizeof(*gcm));
|
||||
#else
|
||||
orig = gcm = XMALLOC(sizeof(*gcm) + 16);
|
||||
#endif
|
||||
if (gcm == NULL) {
|
||||
return CRYPT_MEM;
|
||||
}
|
||||
|
||||
/* Force GCM to be on a multiple of 16 so we can use 128-bit aligned operations
|
||||
* note that we only modify gcm and keep orig intact. This code is not portable
|
||||
* but again it's only for SSE2 anyways, so who cares?
|
||||
*/
|
||||
#ifdef LTC_GCM_TABLES_SSE2
|
||||
if ((unsigned long)gcm & 15) {
|
||||
gcm = (gcm_state *)((unsigned long)gcm + (16 - ((unsigned long)gcm & 15)));
|
||||
}
|
||||
#endif
|
||||
|
||||
if ((err = gcm_init(gcm, cipher, key, keylen)) != CRYPT_OK) {
|
||||
goto LTC_ERR;
|
||||
}
|
||||
if ((err = gcm_add_iv(gcm, IV, IVlen)) != CRYPT_OK) {
|
||||
goto LTC_ERR;
|
||||
}
|
||||
if ((err = gcm_add_aad(gcm, adata, adatalen)) != CRYPT_OK) {
|
||||
goto LTC_ERR;
|
||||
}
|
||||
if ((err = gcm_process(gcm, pt, ptlen, ct, direction)) != CRYPT_OK) {
|
||||
goto LTC_ERR;
|
||||
}
|
||||
err = gcm_done(gcm, tag, taglen);
|
||||
LTC_ERR:
|
||||
XFREE(orig);
|
||||
return err;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/* ref: HEAD -> master, tag: v1.18.2 */
|
||||
/* git commit: 7e7eb695d581782f04b24dc444cbfde86af59853 */
|
||||
/* commit time: 2018-07-01 22:49:01 +0200 */
|
57
thirdparty/libtomcrypt/encauth/gcm/gcm_mult_h.c
vendored
Normal file
57
thirdparty/libtomcrypt/encauth/gcm/gcm_mult_h.c
vendored
Normal file
@ -0,0 +1,57 @@
|
||||
/* LibTomCrypt, modular cryptographic library -- Tom St Denis
|
||||
*
|
||||
* LibTomCrypt is a library that provides various cryptographic
|
||||
* algorithms in a highly modular and flexible manner.
|
||||
*
|
||||
* The library is free for all purposes without any express
|
||||
* guarantee it works.
|
||||
*/
|
||||
|
||||
/**
|
||||
@file gcm_mult_h.c
|
||||
GCM implementation, do the GF mult, by Tom St Denis
|
||||
*/
|
||||
#include "tomcrypt.h"
|
||||
|
||||
#if defined(LTC_GCM_MODE)
|
||||
/**
|
||||
GCM multiply by H
|
||||
@param gcm The GCM state which holds the H value
|
||||
@param I The value to multiply H by
|
||||
*/
|
||||
void gcm_mult_h(gcm_state *gcm, unsigned char *I)
|
||||
{
|
||||
unsigned char T[16];
|
||||
#ifdef LTC_GCM_TABLES
|
||||
int x;
|
||||
#ifdef LTC_GCM_TABLES_SSE2
|
||||
asm("movdqa (%0),%%xmm0"::"r"(&gcm->PC[0][I[0]][0]));
|
||||
for (x = 1; x < 16; x++) {
|
||||
asm("pxor (%0),%%xmm0"::"r"(&gcm->PC[x][I[x]][0]));
|
||||
}
|
||||
asm("movdqa %%xmm0,(%0)"::"r"(&T));
|
||||
#else
|
||||
int y;
|
||||
XMEMCPY(T, &gcm->PC[0][I[0]][0], 16);
|
||||
for (x = 1; x < 16; x++) {
|
||||
#ifdef LTC_FAST
|
||||
for (y = 0; y < 16; y += sizeof(LTC_FAST_TYPE)) {
|
||||
*(LTC_FAST_TYPE_PTR_CAST(T + y)) ^= *(LTC_FAST_TYPE_PTR_CAST(&gcm->PC[x][I[x]][y]));
|
||||
}
|
||||
#else
|
||||
for (y = 0; y < 16; y++) {
|
||||
T[y] ^= gcm->PC[x][I[x]][y];
|
||||
}
|
||||
#endif /* LTC_FAST */
|
||||
}
|
||||
#endif /* LTC_GCM_TABLES_SSE2 */
|
||||
#else
|
||||
gcm_gf_mult(gcm->H, I, T);
|
||||
#endif
|
||||
XMEMCPY(I, T, 16);
|
||||
}
|
||||
#endif
|
||||
|
||||
/* ref: HEAD -> master, tag: v1.18.2 */
|
||||
/* git commit: 7e7eb695d581782f04b24dc444cbfde86af59853 */
|
||||
/* commit time: 2018-07-01 22:49:01 +0200 */
|
160
thirdparty/libtomcrypt/encauth/gcm/gcm_process.c
vendored
Normal file
160
thirdparty/libtomcrypt/encauth/gcm/gcm_process.c
vendored
Normal file
@ -0,0 +1,160 @@
|
||||
/* LibTomCrypt, modular cryptographic library -- Tom St Denis
|
||||
*
|
||||
* LibTomCrypt is a library that provides various cryptographic
|
||||
* algorithms in a highly modular and flexible manner.
|
||||
*
|
||||
* The library is free for all purposes without any express
|
||||
* guarantee it works.
|
||||
*/
|
||||
|
||||
/**
|
||||
@file gcm_process.c
|
||||
GCM implementation, process message data, by Tom St Denis
|
||||
*/
|
||||
#include "tomcrypt.h"
|
||||
|
||||
#ifdef LTC_GCM_MODE
|
||||
|
||||
/**
|
||||
Process plaintext/ciphertext through GCM
|
||||
@param gcm The GCM state
|
||||
@param pt The plaintext
|
||||
@param ptlen The plaintext length (ciphertext length is the same)
|
||||
@param ct The ciphertext
|
||||
@param direction Encrypt or Decrypt mode (GCM_ENCRYPT or GCM_DECRYPT)
|
||||
@return CRYPT_OK on success
|
||||
*/
|
||||
int gcm_process(gcm_state *gcm,
|
||||
unsigned char *pt, unsigned long ptlen,
|
||||
unsigned char *ct,
|
||||
int direction)
|
||||
{
|
||||
unsigned long x;
|
||||
int y, err;
|
||||
unsigned char b;
|
||||
|
||||
LTC_ARGCHK(gcm != NULL);
|
||||
if (ptlen > 0) {
|
||||
LTC_ARGCHK(pt != NULL);
|
||||
LTC_ARGCHK(ct != NULL);
|
||||
}
|
||||
|
||||
if (gcm->buflen > 16 || gcm->buflen < 0) {
|
||||
return CRYPT_INVALID_ARG;
|
||||
}
|
||||
|
||||
if ((err = cipher_is_valid(gcm->cipher)) != CRYPT_OK) {
|
||||
return err;
|
||||
}
|
||||
|
||||
/* 0xFFFFFFFE0 = ((2^39)-256)/8 */
|
||||
if (gcm->pttotlen / 8 + (ulong64)gcm->buflen + (ulong64)ptlen >= CONST64(0xFFFFFFFE0)) {
|
||||
return CRYPT_INVALID_ARG;
|
||||
}
|
||||
|
||||
if (gcm->mode == LTC_GCM_MODE_IV) {
|
||||
/* let's process the IV */
|
||||
if ((err = gcm_add_aad(gcm, NULL, 0)) != CRYPT_OK) return err;
|
||||
}
|
||||
|
||||
/* in AAD mode? */
|
||||
if (gcm->mode == LTC_GCM_MODE_AAD) {
|
||||
/* let's process the AAD */
|
||||
if (gcm->buflen) {
|
||||
gcm->totlen += gcm->buflen * CONST64(8);
|
||||
gcm_mult_h(gcm, gcm->X);
|
||||
}
|
||||
|
||||
/* increment counter */
|
||||
for (y = 15; y >= 12; y--) {
|
||||
if (++gcm->Y[y] & 255) { break; }
|
||||
}
|
||||
/* encrypt the counter */
|
||||
if ((err = cipher_descriptor[gcm->cipher].ecb_encrypt(gcm->Y, gcm->buf, &gcm->K)) != CRYPT_OK) {
|
||||
return err;
|
||||
}
|
||||
|
||||
gcm->buflen = 0;
|
||||
gcm->mode = LTC_GCM_MODE_TEXT;
|
||||
}
|
||||
|
||||
if (gcm->mode != LTC_GCM_MODE_TEXT) {
|
||||
return CRYPT_INVALID_ARG;
|
||||
}
|
||||
|
||||
x = 0;
|
||||
#ifdef LTC_FAST
|
||||
if (gcm->buflen == 0) {
|
||||
if (direction == GCM_ENCRYPT) {
|
||||
for (x = 0; x < (ptlen & ~15); x += 16) {
|
||||
/* ctr encrypt */
|
||||
for (y = 0; y < 16; y += sizeof(LTC_FAST_TYPE)) {
|
||||
*(LTC_FAST_TYPE_PTR_CAST(&ct[x + y])) = *(LTC_FAST_TYPE_PTR_CAST(&pt[x+y])) ^ *(LTC_FAST_TYPE_PTR_CAST(&gcm->buf[y]));
|
||||
*(LTC_FAST_TYPE_PTR_CAST(&gcm->X[y])) ^= *(LTC_FAST_TYPE_PTR_CAST(&ct[x+y]));
|
||||
}
|
||||
/* GMAC it */
|
||||
gcm->pttotlen += 128;
|
||||
gcm_mult_h(gcm, gcm->X);
|
||||
/* increment counter */
|
||||
for (y = 15; y >= 12; y--) {
|
||||
if (++gcm->Y[y] & 255) { break; }
|
||||
}
|
||||
if ((err = cipher_descriptor[gcm->cipher].ecb_encrypt(gcm->Y, gcm->buf, &gcm->K)) != CRYPT_OK) {
|
||||
return err;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
for (x = 0; x < (ptlen & ~15); x += 16) {
|
||||
/* ctr encrypt */
|
||||
for (y = 0; y < 16; y += sizeof(LTC_FAST_TYPE)) {
|
||||
*(LTC_FAST_TYPE_PTR_CAST(&gcm->X[y])) ^= *(LTC_FAST_TYPE_PTR_CAST(&ct[x+y]));
|
||||
*(LTC_FAST_TYPE_PTR_CAST(&pt[x + y])) = *(LTC_FAST_TYPE_PTR_CAST(&ct[x+y])) ^ *(LTC_FAST_TYPE_PTR_CAST(&gcm->buf[y]));
|
||||
}
|
||||
/* GMAC it */
|
||||
gcm->pttotlen += 128;
|
||||
gcm_mult_h(gcm, gcm->X);
|
||||
/* increment counter */
|
||||
for (y = 15; y >= 12; y--) {
|
||||
if (++gcm->Y[y] & 255) { break; }
|
||||
}
|
||||
if ((err = cipher_descriptor[gcm->cipher].ecb_encrypt(gcm->Y, gcm->buf, &gcm->K)) != CRYPT_OK) {
|
||||
return err;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/* process text */
|
||||
for (; x < ptlen; x++) {
|
||||
if (gcm->buflen == 16) {
|
||||
gcm->pttotlen += 128;
|
||||
gcm_mult_h(gcm, gcm->X);
|
||||
|
||||
/* increment counter */
|
||||
for (y = 15; y >= 12; y--) {
|
||||
if (++gcm->Y[y] & 255) { break; }
|
||||
}
|
||||
if ((err = cipher_descriptor[gcm->cipher].ecb_encrypt(gcm->Y, gcm->buf, &gcm->K)) != CRYPT_OK) {
|
||||
return err;
|
||||
}
|
||||
gcm->buflen = 0;
|
||||
}
|
||||
|
||||
if (direction == GCM_ENCRYPT) {
|
||||
b = ct[x] = pt[x] ^ gcm->buf[gcm->buflen];
|
||||
} else {
|
||||
b = ct[x];
|
||||
pt[x] = ct[x] ^ gcm->buf[gcm->buflen];
|
||||
}
|
||||
gcm->X[gcm->buflen++] ^= b;
|
||||
}
|
||||
|
||||
return CRYPT_OK;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/* ref: HEAD -> master, tag: v1.18.2 */
|
||||
/* git commit: 7e7eb695d581782f04b24dc444cbfde86af59853 */
|
||||
/* commit time: 2018-07-01 22:49:01 +0200 */
|
42
thirdparty/libtomcrypt/encauth/gcm/gcm_reset.c
vendored
Normal file
42
thirdparty/libtomcrypt/encauth/gcm/gcm_reset.c
vendored
Normal file
@ -0,0 +1,42 @@
|
||||
/* LibTomCrypt, modular cryptographic library -- Tom St Denis
|
||||
*
|
||||
* LibTomCrypt is a library that provides various cryptographic
|
||||
* algorithms in a highly modular and flexible manner.
|
||||
*
|
||||
* The library is free for all purposes without any express
|
||||
* guarantee it works.
|
||||
*/
|
||||
|
||||
/**
|
||||
@file gcm_reset.c
|
||||
GCM implementation, reset a used state so it can accept IV data, by Tom St Denis
|
||||
*/
|
||||
#include "tomcrypt.h"
|
||||
|
||||
#ifdef LTC_GCM_MODE
|
||||
|
||||
/**
|
||||
Reset a GCM state to as if you just called gcm_init(). This saves the initialization time.
|
||||
@param gcm The GCM state to reset
|
||||
@return CRYPT_OK on success
|
||||
*/
|
||||
int gcm_reset(gcm_state *gcm)
|
||||
{
|
||||
LTC_ARGCHK(gcm != NULL);
|
||||
|
||||
zeromem(gcm->buf, sizeof(gcm->buf));
|
||||
zeromem(gcm->X, sizeof(gcm->X));
|
||||
gcm->mode = LTC_GCM_MODE_IV;
|
||||
gcm->ivmode = 0;
|
||||
gcm->buflen = 0;
|
||||
gcm->totlen = 0;
|
||||
gcm->pttotlen = 0;
|
||||
|
||||
return CRYPT_OK;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/* ref: HEAD -> master, tag: v1.18.2 */
|
||||
/* git commit: 7e7eb695d581782f04b24dc444cbfde86af59853 */
|
||||
/* commit time: 2018-07-01 22:49:01 +0200 */
|
392
thirdparty/libtomcrypt/encauth/gcm/gcm_test.c
vendored
Normal file
392
thirdparty/libtomcrypt/encauth/gcm/gcm_test.c
vendored
Normal file
@ -0,0 +1,392 @@
|
||||
/* LibTomCrypt, modular cryptographic library -- Tom St Denis
|
||||
*
|
||||
* LibTomCrypt is a library that provides various cryptographic
|
||||
* algorithms in a highly modular and flexible manner.
|
||||
*
|
||||
* The library is free for all purposes without any express
|
||||
* guarantee it works.
|
||||
*/
|
||||
|
||||
/**
|
||||
@file gcm_test.c
|
||||
GCM implementation, testing, by Tom St Denis
|
||||
*/
|
||||
#include "tomcrypt.h"
|
||||
|
||||
#ifdef LTC_GCM_MODE
|
||||
|
||||
/**
|
||||
Test the GCM code
|
||||
@return CRYPT_OK on success
|
||||
*/
|
||||
int gcm_test(void)
|
||||
{
|
||||
#ifndef LTC_TEST
|
||||
return CRYPT_NOP;
|
||||
#else
|
||||
static const struct {
|
||||
unsigned char K[32];
|
||||
int keylen;
|
||||
unsigned char P[128];
|
||||
unsigned long ptlen;
|
||||
unsigned char A[128];
|
||||
unsigned long alen;
|
||||
unsigned char IV[128];
|
||||
unsigned long IVlen;
|
||||
unsigned char C[128];
|
||||
unsigned char T[16];
|
||||
} tests[] = {
|
||||
|
||||
/* test case #1 */
|
||||
{
|
||||
/* key */
|
||||
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||
16,
|
||||
|
||||
/* plaintext */
|
||||
{ 0 },
|
||||
0,
|
||||
|
||||
/* AAD data */
|
||||
{ 0 },
|
||||
0,
|
||||
|
||||
/* IV */
|
||||
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00 },
|
||||
12,
|
||||
|
||||
/* ciphertext */
|
||||
{ 0 },
|
||||
|
||||
/* tag */
|
||||
{ 0x58, 0xe2, 0xfc, 0xce, 0xfa, 0x7e, 0x30, 0x61,
|
||||
0x36, 0x7f, 0x1d, 0x57, 0xa4, 0xe7, 0x45, 0x5a }
|
||||
},
|
||||
|
||||
/* test case #2 */
|
||||
{
|
||||
/* key */
|
||||
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||
16,
|
||||
|
||||
/* PT */
|
||||
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||
16,
|
||||
|
||||
/* ADATA */
|
||||
{ 0 },
|
||||
0,
|
||||
|
||||
/* IV */
|
||||
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00 },
|
||||
12,
|
||||
|
||||
/* CT */
|
||||
{ 0x03, 0x88, 0xda, 0xce, 0x60, 0xb6, 0xa3, 0x92,
|
||||
0xf3, 0x28, 0xc2, 0xb9, 0x71, 0xb2, 0xfe, 0x78 },
|
||||
|
||||
/* TAG */
|
||||
{ 0xab, 0x6e, 0x47, 0xd4, 0x2c, 0xec, 0x13, 0xbd,
|
||||
0xf5, 0x3a, 0x67, 0xb2, 0x12, 0x57, 0xbd, 0xdf }
|
||||
},
|
||||
|
||||
/* test case #3 */
|
||||
{
|
||||
/* key */
|
||||
{ 0xfe, 0xff, 0xe9, 0x92, 0x86, 0x65, 0x73, 0x1c,
|
||||
0x6d, 0x6a, 0x8f, 0x94, 0x67, 0x30, 0x83, 0x08, },
|
||||
16,
|
||||
|
||||
/* PT */
|
||||
{ 0xd9, 0x31, 0x32, 0x25, 0xf8, 0x84, 0x06, 0xe5,
|
||||
0xa5, 0x59, 0x09, 0xc5, 0xaf, 0xf5, 0x26, 0x9a,
|
||||
0x86, 0xa7, 0xa9, 0x53, 0x15, 0x34, 0xf7, 0xda,
|
||||
0x2e, 0x4c, 0x30, 0x3d, 0x8a, 0x31, 0x8a, 0x72,
|
||||
0x1c, 0x3c, 0x0c, 0x95, 0x95, 0x68, 0x09, 0x53,
|
||||
0x2f, 0xcf, 0x0e, 0x24, 0x49, 0xa6, 0xb5, 0x25,
|
||||
0xb1, 0x6a, 0xed, 0xf5, 0xaa, 0x0d, 0xe6, 0x57,
|
||||
0xba, 0x63, 0x7b, 0x39, 0x1a, 0xaf, 0xd2, 0x55, },
|
||||
64,
|
||||
|
||||
/* ADATA */
|
||||
{ 0 },
|
||||
0,
|
||||
|
||||
/* IV */
|
||||
{ 0xca, 0xfe, 0xba, 0xbe, 0xfa, 0xce, 0xdb, 0xad,
|
||||
0xde, 0xca, 0xf8, 0x88, },
|
||||
12,
|
||||
|
||||
/* CT */
|
||||
{ 0x42, 0x83, 0x1e, 0xc2, 0x21, 0x77, 0x74, 0x24,
|
||||
0x4b, 0x72, 0x21, 0xb7, 0x84, 0xd0, 0xd4, 0x9c,
|
||||
0xe3, 0xaa, 0x21, 0x2f, 0x2c, 0x02, 0xa4, 0xe0,
|
||||
0x35, 0xc1, 0x7e, 0x23, 0x29, 0xac, 0xa1, 0x2e,
|
||||
0x21, 0xd5, 0x14, 0xb2, 0x54, 0x66, 0x93, 0x1c,
|
||||
0x7d, 0x8f, 0x6a, 0x5a, 0xac, 0x84, 0xaa, 0x05,
|
||||
0x1b, 0xa3, 0x0b, 0x39, 0x6a, 0x0a, 0xac, 0x97,
|
||||
0x3d, 0x58, 0xe0, 0x91, 0x47, 0x3f, 0x59, 0x85, },
|
||||
|
||||
/* TAG */
|
||||
{ 0x4d, 0x5c, 0x2a, 0xf3, 0x27, 0xcd, 0x64, 0xa6,
|
||||
0x2c, 0xf3, 0x5a, 0xbd, 0x2b, 0xa6, 0xfa, 0xb4, }
|
||||
},
|
||||
|
||||
/* test case #4 */
|
||||
{
|
||||
/* key */
|
||||
{ 0xfe, 0xff, 0xe9, 0x92, 0x86, 0x65, 0x73, 0x1c,
|
||||
0x6d, 0x6a, 0x8f, 0x94, 0x67, 0x30, 0x83, 0x08, },
|
||||
16,
|
||||
|
||||
/* PT */
|
||||
{ 0xd9, 0x31, 0x32, 0x25, 0xf8, 0x84, 0x06, 0xe5,
|
||||
0xa5, 0x59, 0x09, 0xc5, 0xaf, 0xf5, 0x26, 0x9a,
|
||||
0x86, 0xa7, 0xa9, 0x53, 0x15, 0x34, 0xf7, 0xda,
|
||||
0x2e, 0x4c, 0x30, 0x3d, 0x8a, 0x31, 0x8a, 0x72,
|
||||
0x1c, 0x3c, 0x0c, 0x95, 0x95, 0x68, 0x09, 0x53,
|
||||
0x2f, 0xcf, 0x0e, 0x24, 0x49, 0xa6, 0xb5, 0x25,
|
||||
0xb1, 0x6a, 0xed, 0xf5, 0xaa, 0x0d, 0xe6, 0x57,
|
||||
0xba, 0x63, 0x7b, 0x39, },
|
||||
60,
|
||||
|
||||
/* ADATA */
|
||||
{ 0xfe, 0xed, 0xfa, 0xce, 0xde, 0xad, 0xbe, 0xef,
|
||||
0xfe, 0xed, 0xfa, 0xce, 0xde, 0xad, 0xbe, 0xef,
|
||||
0xab, 0xad, 0xda, 0xd2, },
|
||||
20,
|
||||
|
||||
/* IV */
|
||||
{ 0xca, 0xfe, 0xba, 0xbe, 0xfa, 0xce, 0xdb, 0xad,
|
||||
0xde, 0xca, 0xf8, 0x88, },
|
||||
12,
|
||||
|
||||
/* CT */
|
||||
{ 0x42, 0x83, 0x1e, 0xc2, 0x21, 0x77, 0x74, 0x24,
|
||||
0x4b, 0x72, 0x21, 0xb7, 0x84, 0xd0, 0xd4, 0x9c,
|
||||
0xe3, 0xaa, 0x21, 0x2f, 0x2c, 0x02, 0xa4, 0xe0,
|
||||
0x35, 0xc1, 0x7e, 0x23, 0x29, 0xac, 0xa1, 0x2e,
|
||||
0x21, 0xd5, 0x14, 0xb2, 0x54, 0x66, 0x93, 0x1c,
|
||||
0x7d, 0x8f, 0x6a, 0x5a, 0xac, 0x84, 0xaa, 0x05,
|
||||
0x1b, 0xa3, 0x0b, 0x39, 0x6a, 0x0a, 0xac, 0x97,
|
||||
0x3d, 0x58, 0xe0, 0x91, },
|
||||
|
||||
/* TAG */
|
||||
{ 0x5b, 0xc9, 0x4f, 0xbc, 0x32, 0x21, 0xa5, 0xdb,
|
||||
0x94, 0xfa, 0xe9, 0x5a, 0xe7, 0x12, 0x1a, 0x47, }
|
||||
|
||||
},
|
||||
|
||||
/* test case #5 */
|
||||
{
|
||||
/* key */
|
||||
{ 0xfe, 0xff, 0xe9, 0x92, 0x86, 0x65, 0x73, 0x1c,
|
||||
0x6d, 0x6a, 0x8f, 0x94, 0x67, 0x30, 0x83, 0x08, },
|
||||
16,
|
||||
|
||||
/* PT */
|
||||
{ 0xd9, 0x31, 0x32, 0x25, 0xf8, 0x84, 0x06, 0xe5,
|
||||
0xa5, 0x59, 0x09, 0xc5, 0xaf, 0xf5, 0x26, 0x9a,
|
||||
0x86, 0xa7, 0xa9, 0x53, 0x15, 0x34, 0xf7, 0xda,
|
||||
0x2e, 0x4c, 0x30, 0x3d, 0x8a, 0x31, 0x8a, 0x72,
|
||||
0x1c, 0x3c, 0x0c, 0x95, 0x95, 0x68, 0x09, 0x53,
|
||||
0x2f, 0xcf, 0x0e, 0x24, 0x49, 0xa6, 0xb5, 0x25,
|
||||
0xb1, 0x6a, 0xed, 0xf5, 0xaa, 0x0d, 0xe6, 0x57,
|
||||
0xba, 0x63, 0x7b, 0x39, },
|
||||
60,
|
||||
|
||||
/* ADATA */
|
||||
{ 0xfe, 0xed, 0xfa, 0xce, 0xde, 0xad, 0xbe, 0xef,
|
||||
0xfe, 0xed, 0xfa, 0xce, 0xde, 0xad, 0xbe, 0xef,
|
||||
0xab, 0xad, 0xda, 0xd2, },
|
||||
20,
|
||||
|
||||
/* IV */
|
||||
{ 0xca, 0xfe, 0xba, 0xbe, 0xfa, 0xce, 0xdb, 0xad, },
|
||||
8,
|
||||
|
||||
/* CT */
|
||||
{ 0x61, 0x35, 0x3b, 0x4c, 0x28, 0x06, 0x93, 0x4a,
|
||||
0x77, 0x7f, 0xf5, 0x1f, 0xa2, 0x2a, 0x47, 0x55,
|
||||
0x69, 0x9b, 0x2a, 0x71, 0x4f, 0xcd, 0xc6, 0xf8,
|
||||
0x37, 0x66, 0xe5, 0xf9, 0x7b, 0x6c, 0x74, 0x23,
|
||||
0x73, 0x80, 0x69, 0x00, 0xe4, 0x9f, 0x24, 0xb2,
|
||||
0x2b, 0x09, 0x75, 0x44, 0xd4, 0x89, 0x6b, 0x42,
|
||||
0x49, 0x89, 0xb5, 0xe1, 0xeb, 0xac, 0x0f, 0x07,
|
||||
0xc2, 0x3f, 0x45, 0x98, },
|
||||
|
||||
/* TAG */
|
||||
{ 0x36, 0x12, 0xd2, 0xe7, 0x9e, 0x3b, 0x07, 0x85,
|
||||
0x56, 0x1b, 0xe1, 0x4a, 0xac, 0xa2, 0xfc, 0xcb, }
|
||||
},
|
||||
|
||||
/* test case #6 */
|
||||
{
|
||||
/* key */
|
||||
{ 0xfe, 0xff, 0xe9, 0x92, 0x86, 0x65, 0x73, 0x1c,
|
||||
0x6d, 0x6a, 0x8f, 0x94, 0x67, 0x30, 0x83, 0x08, },
|
||||
16,
|
||||
|
||||
/* PT */
|
||||
{ 0xd9, 0x31, 0x32, 0x25, 0xf8, 0x84, 0x06, 0xe5,
|
||||
0xa5, 0x59, 0x09, 0xc5, 0xaf, 0xf5, 0x26, 0x9a,
|
||||
0x86, 0xa7, 0xa9, 0x53, 0x15, 0x34, 0xf7, 0xda,
|
||||
0x2e, 0x4c, 0x30, 0x3d, 0x8a, 0x31, 0x8a, 0x72,
|
||||
0x1c, 0x3c, 0x0c, 0x95, 0x95, 0x68, 0x09, 0x53,
|
||||
0x2f, 0xcf, 0x0e, 0x24, 0x49, 0xa6, 0xb5, 0x25,
|
||||
0xb1, 0x6a, 0xed, 0xf5, 0xaa, 0x0d, 0xe6, 0x57,
|
||||
0xba, 0x63, 0x7b, 0x39, },
|
||||
60,
|
||||
|
||||
/* ADATA */
|
||||
{ 0xfe, 0xed, 0xfa, 0xce, 0xde, 0xad, 0xbe, 0xef,
|
||||
0xfe, 0xed, 0xfa, 0xce, 0xde, 0xad, 0xbe, 0xef,
|
||||
0xab, 0xad, 0xda, 0xd2, },
|
||||
20,
|
||||
|
||||
/* IV */
|
||||
{ 0x93, 0x13, 0x22, 0x5d, 0xf8, 0x84, 0x06, 0xe5,
|
||||
0x55, 0x90, 0x9c, 0x5a, 0xff, 0x52, 0x69, 0xaa,
|
||||
0x6a, 0x7a, 0x95, 0x38, 0x53, 0x4f, 0x7d, 0xa1,
|
||||
0xe4, 0xc3, 0x03, 0xd2, 0xa3, 0x18, 0xa7, 0x28,
|
||||
0xc3, 0xc0, 0xc9, 0x51, 0x56, 0x80, 0x95, 0x39,
|
||||
0xfc, 0xf0, 0xe2, 0x42, 0x9a, 0x6b, 0x52, 0x54,
|
||||
0x16, 0xae, 0xdb, 0xf5, 0xa0, 0xde, 0x6a, 0x57,
|
||||
0xa6, 0x37, 0xb3, 0x9b, },
|
||||
60,
|
||||
|
||||
/* CT */
|
||||
{ 0x8c, 0xe2, 0x49, 0x98, 0x62, 0x56, 0x15, 0xb6,
|
||||
0x03, 0xa0, 0x33, 0xac, 0xa1, 0x3f, 0xb8, 0x94,
|
||||
0xbe, 0x91, 0x12, 0xa5, 0xc3, 0xa2, 0x11, 0xa8,
|
||||
0xba, 0x26, 0x2a, 0x3c, 0xca, 0x7e, 0x2c, 0xa7,
|
||||
0x01, 0xe4, 0xa9, 0xa4, 0xfb, 0xa4, 0x3c, 0x90,
|
||||
0xcc, 0xdc, 0xb2, 0x81, 0xd4, 0x8c, 0x7c, 0x6f,
|
||||
0xd6, 0x28, 0x75, 0xd2, 0xac, 0xa4, 0x17, 0x03,
|
||||
0x4c, 0x34, 0xae, 0xe5, },
|
||||
|
||||
/* TAG */
|
||||
{ 0x61, 0x9c, 0xc5, 0xae, 0xff, 0xfe, 0x0b, 0xfa,
|
||||
0x46, 0x2a, 0xf4, 0x3c, 0x16, 0x99, 0xd0, 0x50, }
|
||||
},
|
||||
|
||||
/* test case #46 from BG (catches the LTC bug of v1.15) */
|
||||
{
|
||||
/* key */
|
||||
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||
16,
|
||||
|
||||
/* PT */
|
||||
{ 0xa2, 0xaa, 0xb3, 0xad, 0x8b, 0x17, 0xac, 0xdd,
|
||||
0xa2, 0x88, 0x42, 0x6c, 0xd7, 0xc4, 0x29, 0xb7,
|
||||
0xca, 0x86, 0xb7, 0xac, 0xa0, 0x58, 0x09, 0xc7,
|
||||
0x0c, 0xe8, 0x2d, 0xb2, 0x57, 0x11, 0xcb, 0x53,
|
||||
0x02, 0xeb, 0x27, 0x43, 0xb0, 0x36, 0xf3, 0xd7,
|
||||
0x50, 0xd6, 0xcf, 0x0d, 0xc0, 0xac, 0xb9, 0x29,
|
||||
0x50, 0xd5, 0x46, 0xdb, 0x30, 0x8f, 0x93, 0xb4,
|
||||
0xff, 0x24, 0x4a, 0xfa, 0x9d, 0xc7, 0x2b, 0xcd,
|
||||
0x75, 0x8d, 0x2c },
|
||||
67,
|
||||
|
||||
/* ADATA */
|
||||
{ 0x68, 0x8e, 0x1a, 0xa9, 0x84, 0xde, 0x92, 0x6d,
|
||||
0xc7, 0xb4, 0xc4, 0x7f, 0x44 },
|
||||
13,
|
||||
|
||||
/* IV */
|
||||
{ 0xb7, 0x21, 0x38, 0xb5, 0xa0, 0x5f, 0xf5, 0x07,
|
||||
0x0e, 0x8c, 0xd9, 0x41, 0x83, 0xf7, 0x61, 0xd8 },
|
||||
16,
|
||||
|
||||
/* CT */
|
||||
{ 0xcb, 0xc8, 0xd2, 0xf1, 0x54, 0x81, 0xa4, 0xcc,
|
||||
0x7d, 0xd1, 0xe1, 0x9a, 0xaa, 0x83, 0xde, 0x56,
|
||||
0x78, 0x48, 0x3e, 0xc3, 0x59, 0xae, 0x7d, 0xec,
|
||||
0x2a, 0xb8, 0xd5, 0x34, 0xe0, 0x90, 0x6f, 0x4b,
|
||||
0x46, 0x63, 0xfa, 0xff, 0x58, 0xa8, 0xb2, 0xd7,
|
||||
0x33, 0xb8, 0x45, 0xee, 0xf7, 0xc9, 0xb3, 0x31,
|
||||
0xe9, 0xe1, 0x0e, 0xb2, 0x61, 0x2c, 0x99, 0x5f,
|
||||
0xeb, 0x1a, 0xc1, 0x5a, 0x62, 0x86, 0xcc, 0xe8,
|
||||
0xb2, 0x97, 0xa8 },
|
||||
|
||||
/* TAG */
|
||||
{ 0x8d, 0x2d, 0x2a, 0x93, 0x72, 0x62, 0x6f, 0x6b,
|
||||
0xee, 0x85, 0x80, 0x27, 0x6a, 0x63, 0x66, 0xbf }
|
||||
}
|
||||
|
||||
/* rest of test cases are the same except AES key size changes... ignored... */
|
||||
};
|
||||
int idx, err;
|
||||
unsigned long x, y;
|
||||
unsigned char out[2][128], T[2][16];
|
||||
gcm_state gcm;
|
||||
|
||||
/* find aes */
|
||||
idx = find_cipher("aes");
|
||||
if (idx == -1) {
|
||||
idx = find_cipher("rijndael");
|
||||
if (idx == -1) {
|
||||
return CRYPT_NOP;
|
||||
}
|
||||
}
|
||||
|
||||
/* Special test case for empty AAD + empty PT */
|
||||
y = sizeof(T[0]);
|
||||
if ((err = gcm_init(&gcm, idx, tests[0].K, tests[0].keylen)) != CRYPT_OK) return err;
|
||||
if ((err = gcm_add_iv(&gcm, tests[0].IV, tests[0].IVlen)) != CRYPT_OK) return err;
|
||||
/* intentionally skip gcm_add_aad + gcm_process */
|
||||
if ((err = gcm_done(&gcm, T[0], &y)) != CRYPT_OK) return err;
|
||||
if (compare_testvector(T[0], y, tests[0].T, 16, "GCM Encrypt Tag-special", 0)) return CRYPT_FAIL_TESTVECTOR;
|
||||
|
||||
for (x = 0; x < (int)(sizeof(tests)/sizeof(tests[0])); x++) {
|
||||
y = sizeof(T[0]);
|
||||
if ((err = gcm_memory(idx, tests[x].K, tests[x].keylen,
|
||||
tests[x].IV, tests[x].IVlen,
|
||||
tests[x].A, tests[x].alen,
|
||||
(unsigned char*)tests[x].P, tests[x].ptlen,
|
||||
out[0], T[0], &y, GCM_ENCRYPT)) != CRYPT_OK) {
|
||||
return err;
|
||||
}
|
||||
|
||||
if (compare_testvector(out[0], tests[x].ptlen, tests[x].C, tests[x].ptlen, "GCM CT", x)) {
|
||||
return CRYPT_FAIL_TESTVECTOR;
|
||||
}
|
||||
|
||||
if (compare_testvector(T[0], y, tests[x].T, 16, "GCM Encrypt Tag", x)) {
|
||||
return CRYPT_FAIL_TESTVECTOR;
|
||||
}
|
||||
|
||||
y = sizeof(T[1]);
|
||||
if ((err = gcm_memory(idx, tests[x].K, tests[x].keylen,
|
||||
tests[x].IV, tests[x].IVlen,
|
||||
tests[x].A, tests[x].alen,
|
||||
out[1], tests[x].ptlen,
|
||||
out[0], T[1], &y, GCM_DECRYPT)) != CRYPT_OK) {
|
||||
return err;
|
||||
}
|
||||
|
||||
if (compare_testvector(out[1], tests[x].ptlen, tests[x].P, tests[x].ptlen, "GCM PT", x)) {
|
||||
return CRYPT_FAIL_TESTVECTOR;
|
||||
}
|
||||
|
||||
if (compare_testvector(T[1], y, tests[x].T, 16, "GCM Decrypt Tag", x)) {
|
||||
return CRYPT_FAIL_TESTVECTOR;
|
||||
}
|
||||
|
||||
}
|
||||
return CRYPT_OK;
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
/* ref: HEAD -> master, tag: v1.18.2 */
|
||||
/* git commit: 7e7eb695d581782f04b24dc444cbfde86af59853 */
|
||||
/* commit time: 2018-07-01 22:49:01 +0200 */
|
Reference in New Issue
Block a user