/src/openssl31/providers/implementations/ciphers/ciphercommon_gcm_hw.c
Line | Count | Source (jump to first uncovered line) |
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 | 1.50M | { |
16 | 1.50M | CRYPTO_gcm128_setiv(&ctx->gcm, iv, ivlen); |
17 | 1.50M | return 1; |
18 | 1.50M | } |
19 | | |
20 | | int ossl_gcm_aad_update(PROV_GCM_CTX *ctx, const unsigned char *aad, |
21 | | size_t aad_len) |
22 | 1.60M | { |
23 | 1.60M | return CRYPTO_gcm128_aad(&ctx->gcm, aad, aad_len) == 0; |
24 | 1.60M | } |
25 | | |
26 | | int ossl_gcm_cipher_update(PROV_GCM_CTX *ctx, const unsigned char *in, |
27 | | size_t len, unsigned char *out) |
28 | 7.74k | { |
29 | 7.74k | if (ctx->enc) { |
30 | 449 | if (CRYPTO_gcm128_encrypt(&ctx->gcm, in, out, len)) |
31 | 0 | return 0; |
32 | 7.29k | } else { |
33 | 7.29k | if (CRYPTO_gcm128_decrypt(&ctx->gcm, in, out, len)) |
34 | 0 | return 0; |
35 | 7.29k | } |
36 | 7.74k | return 1; |
37 | 7.74k | } |
38 | | |
39 | | int ossl_gcm_cipher_final(PROV_GCM_CTX *ctx, unsigned char *tag) |
40 | 1.50M | { |
41 | 1.50M | if (ctx->enc) { |
42 | 887k | CRYPTO_gcm128_tag(&ctx->gcm, tag, GCM_TAG_MAX_SIZE); |
43 | 887k | ctx->taglen = GCM_TAG_MAX_SIZE; |
44 | 887k | } else { |
45 | 613k | if (CRYPTO_gcm128_finish(&ctx->gcm, tag, ctx->taglen) != 0) |
46 | 611k | return 0; |
47 | 613k | } |
48 | 889k | return 1; |
49 | 1.50M | } |
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 | 10.6k | { |
55 | 10.6k | int ret = 0; |
56 | | |
57 | | /* Use saved AAD */ |
58 | 10.6k | if (!ctx->hw->aadupdate(ctx, aad, aad_len)) |
59 | 0 | goto err; |
60 | 10.6k | if (!ctx->hw->cipherupdate(ctx, in, in_len, out)) |
61 | 0 | goto err; |
62 | 10.6k | ctx->taglen = GCM_TAG_MAX_SIZE; |
63 | 10.6k | if (!ctx->hw->cipherfinal(ctx, tag)) |
64 | 9.33k | goto err; |
65 | 1.35k | ret = 1; |
66 | | |
67 | 10.6k | err: |
68 | 10.6k | return ret; |
69 | 1.35k | } |