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