/src/openssl/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 | 0 | { |
16 | 0 | CRYPTO_gcm128_setiv(&ctx->gcm, iv, ivlen); |
17 | 0 | return 1; |
18 | 0 | } |
19 | | |
20 | | int ossl_gcm_aad_update(PROV_GCM_CTX *ctx, const unsigned char *aad, |
21 | | size_t aad_len) |
22 | 0 | { |
23 | 0 | return CRYPTO_gcm128_aad(&ctx->gcm, aad, aad_len) == 0; |
24 | 0 | } |
25 | | |
26 | | int ossl_gcm_cipher_update(PROV_GCM_CTX *ctx, const unsigned char *in, |
27 | | size_t len, unsigned char *out) |
28 | 0 | { |
29 | 0 | if (ctx->enc) { |
30 | 0 | if (CRYPTO_gcm128_encrypt(&ctx->gcm, in, out, len)) |
31 | 0 | return 0; |
32 | 0 | } else { |
33 | 0 | if (CRYPTO_gcm128_decrypt(&ctx->gcm, in, out, len)) |
34 | 0 | return 0; |
35 | 0 | } |
36 | 0 | return 1; |
37 | 0 | } |
38 | | |
39 | | int ossl_gcm_cipher_final(PROV_GCM_CTX *ctx, unsigned char *tag) |
40 | 0 | { |
41 | 0 | if (ctx->enc) { |
42 | 0 | CRYPTO_gcm128_tag(&ctx->gcm, tag, GCM_TAG_MAX_SIZE); |
43 | 0 | ctx->taglen = GCM_TAG_MAX_SIZE; |
44 | 0 | } else { |
45 | 0 | if (CRYPTO_gcm128_finish(&ctx->gcm, tag, ctx->taglen) != 0) |
46 | 0 | return 0; |
47 | 0 | } |
48 | 0 | return 1; |
49 | 0 | } |
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 | 0 | { |
55 | 0 | int ret = 0; |
56 | | |
57 | | /* Use saved AAD */ |
58 | 0 | if (!ctx->hw->aadupdate(ctx, aad, aad_len)) |
59 | 0 | goto err; |
60 | 0 | if (!ctx->hw->cipherupdate(ctx, in, in_len, out)) |
61 | 0 | goto err; |
62 | 0 | ctx->taglen = GCM_TAG_MAX_SIZE; |
63 | 0 | if (!ctx->hw->cipherfinal(ctx, tag)) |
64 | 0 | goto err; |
65 | 0 | ret = 1; |
66 | |
|
67 | 0 | err: |
68 | 0 | return ret; |
69 | 0 | } |