Don't need separate tag buffer for GCM mode: use EVP_CIPHER_CTX buf
[openssl.git] / crypto / evp / e_aes.c
index c093eb5e59e1ae5e0ea2e786d9f3bd73e255d790..0a980fe82e699b383edc0616a99dc705e0a50f35 100644 (file)
@@ -201,8 +201,6 @@ typedef struct
        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;
@@ -268,14 +266,14 @@ static int aes_gcm_ctrl(EVP_CIPHER_CTX *c, int type, int arg, void *ptr)
        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:
@@ -385,12 +383,12 @@ static int aes_gcm(EVP_CIPHER_CTX *ctx, unsigned char *out,
                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;
@@ -519,6 +517,14 @@ static int aes_xts(EVP_CIPHER_CTX *ctx, unsigned char *out,
                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;