unsigned char *iv;
/* IV length */
int ivlen;
- /* Tag to verify */
- unsigned char tag[16];
int taglen;
/* It is OK to generate IVs */
int iv_gen;
case EVP_CTRL_GCM_SET_TAG:
if (arg <= 0 || arg > 16 || c->encrypt)
return 0;
- memcpy(gctx->tag, ptr, arg);
+ memcpy(c->buf, ptr, arg);
gctx->taglen = arg;
return 1;
case EVP_CTRL_GCM_GET_TAG:
if (arg <= 0 || arg > 16 || !c->encrypt || gctx->taglen < 0)
return 0;
- memcpy(ptr, gctx->tag, arg);
+ memcpy(ptr, c->buf, arg);
return 1;
case EVP_CTRL_GCM_SET_IV_FIXED:
if (!ctx->encrypt)
{
if (CRYPTO_gcm128_finish(&gctx->gcm,
- gctx->tag, gctx->taglen) != 0)
+ ctx->buf, gctx->taglen) != 0)
return -1;
gctx->iv_set = 0;
return 0;
}
- CRYPTO_gcm128_tag(&gctx->gcm, gctx->tag, 16);
+ CRYPTO_gcm128_tag(&gctx->gcm, ctx->buf, 16);
gctx->taglen = 16;
/* Don't reuse the IV */
gctx->iv_set = 0;
return -1;
if (!out || !in)
return -1;
+#ifdef OPENSSL_FIPS
+ /* Requirement of SP800-38E */
+ if (FIPS_mode() && len > (1L<<20)*16)
+ {
+ EVPerr(EVP_F_AES_XTS, EVP_R_TOO_LARGE);
+ return -1;
+ }
+#endif
if (CRYPTO_xts128_encrypt(&xctx->xts, ctx->iv, in, out, len,
ctx->encrypt))
return -1;