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 |
|
---|
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 |
|
---|
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 |
|
---|
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 |
|
---|
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 |
|
---|
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 | }
|
---|