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