1e1051a39Sopenharmony_ci/* 2e1051a39Sopenharmony_ci * Copyright 2001-2021 The OpenSSL Project Authors. All Rights Reserved. 3e1051a39Sopenharmony_ci * 4e1051a39Sopenharmony_ci * Licensed under the Apache License 2.0 (the "License"). You may not use 5e1051a39Sopenharmony_ci * this file except in compliance with the License. You can obtain a copy 6e1051a39Sopenharmony_ci * in the file LICENSE in the source distribution or at 7e1051a39Sopenharmony_ci * https://www.openssl.org/source/license.html 8e1051a39Sopenharmony_ci */ 9e1051a39Sopenharmony_ci 10e1051a39Sopenharmony_ci#include "prov/ciphercommon.h" 11e1051a39Sopenharmony_ci#include "prov/ciphercommon_gcm.h" 12e1051a39Sopenharmony_ci 13e1051a39Sopenharmony_ci 14e1051a39Sopenharmony_ciint ossl_gcm_setiv(PROV_GCM_CTX *ctx, const unsigned char *iv, size_t ivlen) 15e1051a39Sopenharmony_ci{ 16e1051a39Sopenharmony_ci CRYPTO_gcm128_setiv(&ctx->gcm, iv, ivlen); 17e1051a39Sopenharmony_ci return 1; 18e1051a39Sopenharmony_ci} 19e1051a39Sopenharmony_ci 20e1051a39Sopenharmony_ciint ossl_gcm_aad_update(PROV_GCM_CTX *ctx, const unsigned char *aad, 21e1051a39Sopenharmony_ci size_t aad_len) 22e1051a39Sopenharmony_ci{ 23e1051a39Sopenharmony_ci return CRYPTO_gcm128_aad(&ctx->gcm, aad, aad_len) == 0; 24e1051a39Sopenharmony_ci} 25e1051a39Sopenharmony_ci 26e1051a39Sopenharmony_ciint ossl_gcm_cipher_update(PROV_GCM_CTX *ctx, const unsigned char *in, 27e1051a39Sopenharmony_ci size_t len, unsigned char *out) 28e1051a39Sopenharmony_ci{ 29e1051a39Sopenharmony_ci if (ctx->enc) { 30e1051a39Sopenharmony_ci if (CRYPTO_gcm128_encrypt(&ctx->gcm, in, out, len)) 31e1051a39Sopenharmony_ci return 0; 32e1051a39Sopenharmony_ci } else { 33e1051a39Sopenharmony_ci if (CRYPTO_gcm128_decrypt(&ctx->gcm, in, out, len)) 34e1051a39Sopenharmony_ci return 0; 35e1051a39Sopenharmony_ci } 36e1051a39Sopenharmony_ci return 1; 37e1051a39Sopenharmony_ci} 38e1051a39Sopenharmony_ci 39e1051a39Sopenharmony_ciint ossl_gcm_cipher_final(PROV_GCM_CTX *ctx, unsigned char *tag) 40e1051a39Sopenharmony_ci{ 41e1051a39Sopenharmony_ci if (ctx->enc) { 42e1051a39Sopenharmony_ci CRYPTO_gcm128_tag(&ctx->gcm, tag, GCM_TAG_MAX_SIZE); 43e1051a39Sopenharmony_ci ctx->taglen = GCM_TAG_MAX_SIZE; 44e1051a39Sopenharmony_ci } else { 45e1051a39Sopenharmony_ci if (CRYPTO_gcm128_finish(&ctx->gcm, tag, ctx->taglen) != 0) 46e1051a39Sopenharmony_ci return 0; 47e1051a39Sopenharmony_ci } 48e1051a39Sopenharmony_ci return 1; 49e1051a39Sopenharmony_ci} 50e1051a39Sopenharmony_ci 51e1051a39Sopenharmony_ciint ossl_gcm_one_shot(PROV_GCM_CTX *ctx, unsigned char *aad, size_t aad_len, 52e1051a39Sopenharmony_ci const unsigned char *in, size_t in_len, 53e1051a39Sopenharmony_ci unsigned char *out, unsigned char *tag, size_t tag_len) 54e1051a39Sopenharmony_ci{ 55e1051a39Sopenharmony_ci int ret = 0; 56e1051a39Sopenharmony_ci 57e1051a39Sopenharmony_ci /* Use saved AAD */ 58e1051a39Sopenharmony_ci if (!ctx->hw->aadupdate(ctx, aad, aad_len)) 59e1051a39Sopenharmony_ci goto err; 60e1051a39Sopenharmony_ci if (!ctx->hw->cipherupdate(ctx, in, in_len, out)) 61e1051a39Sopenharmony_ci goto err; 62e1051a39Sopenharmony_ci ctx->taglen = GCM_TAG_MAX_SIZE; 63e1051a39Sopenharmony_ci if (!ctx->hw->cipherfinal(ctx, tag)) 64e1051a39Sopenharmony_ci goto err; 65e1051a39Sopenharmony_ci ret = 1; 66e1051a39Sopenharmony_ci 67e1051a39Sopenharmony_cierr: 68e1051a39Sopenharmony_ci return ret; 69e1051a39Sopenharmony_ci} 70